按值将 std::thread 推入列表
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
操作)。
The fact that I use threads.push_back() means that I run the copy-constructor
不,不是。由于 C++11 push_back
被重载以接受对列表值类型的右值引用。
您不能 运行 std::thread
的复制构造函数,因为它被声明为已删除。添加上面提到的 push_back
重载正是为了支持仅移动类型,如线程句柄。
如果想直接把线程初始化到容器中而不用动,那么emplace_back
可以做到。但是您需要为 std::thread
构造函数传递参数,而不是从它们初始化的线程:
threads.emplace_back(my_function, i);
我的代码如下所示:
#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
操作)。
The fact that I use threads.push_back() means that I run the copy-constructor
不,不是。由于 C++11 push_back
被重载以接受对列表值类型的右值引用。
您不能 运行 std::thread
的复制构造函数,因为它被声明为已删除。添加上面提到的 push_back
重载正是为了支持仅移动类型,如线程句柄。
如果想直接把线程初始化到容器中而不用动,那么emplace_back
可以做到。但是您需要为 std::thread
构造函数传递参数,而不是从它们初始化的线程:
threads.emplace_back(my_function, i);