按值将std :: thread推入列表

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操作).

Sto*_*ica 6

我使用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)