按值将std :: thread推入列表

时间:2018-10-10 14:11:04

标签: 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;
}

我使用threads.push_back()的事实意味着我运行了复制构造器std::thread::thread(const thread&)

  • 安全吗?

  • 我应该使用std::move吗?

请假设我事先不知道我需要多少个线程,所以对我来说,用数组或std::vector替换列表是不可行的(std::vector仅在我事先知道线程数的情况下才是一种选择,因为我负担不起向量的realloc操作)。

1 个答案:

答案 0 :(得分:6)

  

我使用threads.push_back()的事实意味着我运行了复制构造器

不,不是。由于C ++ 11 push_back被重载以接受对列表的值类型的右值引用。

您无法运行std::thread的副本构造函数,因为它被声明为已删除。添加上述push_back重载的目的是为了支持仅移动类型,例如线程句柄。

如果您希望不移动而直接将线程初始化到容器中,则emplace_back可以做到。但是您需要传入std::thread构造函数的参数,而不是从其初始化的线程:

threads.emplace_back(my_function, i);