[英]vector of std::threads
C ++ 11
我正在嘗試制作std::thread
s的vector
。 以下三點的組合說我可以。
1.)根據http://en.cppreference.com/w/cpp/thread/thread/thread , thread
的默認構造函數創建了一個
不代表線程的線程對象。
2.)根據http://en.cppreference.com/w/cpp/thread/thread/operator%3D , thread
的operator=
使用移動語義將[參數,即線程右值引用]的狀態分配給[調用線程]。
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的輸出是正確的,那么使用thread
的operator=
? 或者這是一個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編譯器)不支持標准庫上的統一初始化語法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.