Som*_*ing 0 c++ multithreading stdthread
我的代码如下所示:
#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;
}
Run Code Online (Sandbox Code Playgroud)
我使用的事实threads.push_back()意味着我运行了复制构造函数std::thread::thread(const thread&).
安全吗?
我应该用std::move吗?
请假设我事先并不知道我需要多少线程,所以用数组或者用一个替换列表std::vector对我来说不是一个选项(std::vector只有当我知道线程的数量时才会有一个选项)前进,因为我买不起矢量的realloc操作).
我使用threads.push_back()的事实意味着我运行了复制构造函数
不,不是的.由于C++ 11 push_back被重载以接受对列表值类型的右值引用.
你不能运行std::thread复制构造函数,因为它被声明为已删除.push_back为了支持仅移动类型(如线程句柄)的这个确切目的,添加了上面提到的重载.
如果你想在没有移动的情况下直接将线程初始化到容器中,那么emplace_back就可以这样做.但是你需要传递std::thread构造函数的参数,而不是从它们初始化的线程:
threads.emplace_back(my_function, i);
Run Code Online (Sandbox Code Playgroud)