簡體   English   中英

矢量std :: threads

[英]vector of std::threads

C ++ 11

我正在嘗試制作std::thread s的vector 以下三點的組合說我可以。

1.)根據http://en.cppreference.com/w/cpp/thread/thread/threadthread的默認構造函數創建了一個

不代表線程的線程對象。

2.)根據http://en.cppreference.com/w/cpp/thread/thread/operator%3Dthreadoperator=

使用移動語義將[參數,即線程右值引用]的狀態分配給[調用線程]。

3.)根據http://en.cppreference.com/w/cpp/container/vector/vector ,僅將大小類型變量傳遞給向量構造函數

具有[指定數量]的值初始化(對於類的默認構造)T實例的容器。沒有復制。

所以,我這樣做了:

#include <iostream>
#include <thread>
#include <vector>

void foo()
{
    std::cout << "Hello\n";
    return;
}

int main()
{
    std::vector<std::thread> vecThread(1);
    vecThread.at(0) = std::thread(foo);
    vecThread.at(0).join();
    return 0;
}

這在VC11和g ++ 4.8.0(在線編譯器)中按預期運行,如下所示:

控制台輸出:

Hello

然后我在clang 3.2中嘗試了它,通過在同一個網頁上切換編譯器菜單,這給出了:

stderr: 
pure virtual method called
terminate called without an active exception

當一個線程對象(表示一個線程join()在進行join() ed或detach() ed之前超出范圍時,程序將被強制終止。 我有join() ed vecThread.at(0) ,所以唯一剩下的就是臨時線程

std::thread(foo);

在里面

vecThread.at(0) = std::thread(foo);

分配。

但是,根據Web引用,只能通過移動線程右值引用來分配線程。 我想不出任何join()detach()臨時線程對象的方法。

所以如果clang的輸出是正確的,那么使用threadoperator= 或者這是一個clang編譯器錯誤?

在g ++ 4.8.0中,更改行

vecThread.at(0) = std::thread(foo)

vecThread.at(0) = std::thread{foo}

(用括號替換括號)仍然給出了預期的Hello輸出。

但是,將行更改為vecThread.at(0) = {foo}會讓它抱怨:

g ++ 4.8.0對括號的投訴:

錯誤:從初始化列表轉換為'std :: thread'將使用顯式構造函數'std :: thread :: thread(_Callable &&,_ Args && ...)[with _Callable = void(&)(); _Args = {}]'vecThread.at(0)= {foo};

這太先進了 - 我不知道它意味着什么。

在clang中進行相同的更改可以提供更高級的功能:

clang 3.2對括號的投訴:

error: no viable overloaded '='
vecThread.at(0) = {foo};
...
note: candidate function not viable: cannot convert initializer list
argument to 'const std::thread'
thread& operator=(const thread&) = delete;
...
note: candidate function not viable: cannot convert initializer list
argument to 'std::thread'
thread& operator=(thread&& __t) noexcept

我也不知道這意味着什么。

我無法使用VC11來證實上述內容

vecThread.at(0) = {foo}

問題是因為VC11(截至2012年11月的CTP編譯器)不支持標准庫上的統一初始化語法。

你的第一個例子是正確的。 當你使用clang和libstdc ++時,拋出異常是一個已知的錯誤 要解決它,您必須安裝libc ++(llvm版本的c ++庫)。 請參閱下面的使用libc ++進行編譯的示例

#include <thread>

int main()
{
    std::thread t([] () {});
    t.join();
    return 0;
}

$ clang++ -std=c++11 -stdlib=libc++ main.cpp -o main -lc++ -lsupc++ -lpthread

PS請看這里 ,為什么標志-lsupc++需要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM