我的代码如下:
#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
操作)。
答案 0 :(得分:6)
我使用threads.push_back()的事实意味着我运行了复制构造器
不,不是。由于C ++ 11 push_back
被重载以接受对列表的值类型的右值引用。
您无法运行std::thread
的副本构造函数,因为它被声明为已删除。添加上述push_back
重载的目的是为了支持仅移动类型,例如线程句柄。
如果您希望不移动而直接将线程初始化到容器中,则emplace_back
可以做到。但是您需要传入std::thread
构造函数的参数,而不是从其初始化的线程:
threads.emplace_back(my_function, i);