按值将 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::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);