[英]Pushing std::thread by value into a list
我的代碼如下所示:
#include <list>
#include <thread>
void my_function(int val) {
// Empty function
}
int main() {
std::list<std::thread> threads;
for (int i = 0 ; i < 10 ; i++) {
threads.push_back(std::thread(my_function, i));
}
return 0;
}
我使用threads.push_back()
的事實意味着我運行了復制構造器std::thread::thread(const thread&)
。
安全嗎?
我應該使用std::move
嗎?
請假設我事先不知道需要多少個線程,所以用數組或std::vector
替換列表對我來說不是一個選擇( std::vector
僅是一個選擇如果我提前知道線程數,因為我負擔不起向量的realloc
操作)。
我使用threads.push_back()的事實意味着我運行了復制構造函數
不,不是的。 由於C ++ 11 push_back
重載以接受對列表的值類型的右值引用。
您不能運行std::thread
的副本構造函數,因為它被聲明為Deleted。 添加了上述的push_back
重載,以達到支持僅移動類型(例如線程句柄)的確切目的。
如果您希望不移動而直接將線程直接初始化到容器中,則emplace_back
可以執行此操作。 但是您需要傳入std::thread
構造函數的參數,而不是從中初始化的線程:
threads.emplace_back(my_function, i);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.