具有unique_ptr和线程的默认向量构造函数

时间:2017-06-20 20:58:23

标签: c++ multithreading c++14 unique-ptr

调用默认矢量构造函数的正确方法是什么,以创建' n' std::unique_ptr持有线程的元素。

std::vector<std::unique_ptr<std::thread>> thr_grp(5, std::move(std::make_unique<std::thread>(std::thread(), threadWorker)));

std::vector<std::unique_ptr<std::thread>> thr_grp(5, std::move(std::unique_ptr<std::thread>(new std::thread(threadWorker))));

或者没有std::move语义?

1 个答案:

答案 0 :(得分:6)

这不能以这种方式完成,因为std::vector的填充constructors使指定参数的副本和std::unique_ptr删除了复制构造函数。

您可以将emplace个元素转换为默认构造的std::vector<std::unique_ptr<std::thread>>,如下例所示:

#include <iostream>
#include <memory>
#include <thread>
#include <vector>

void threadWorker() {
    std::cout << "I'm thread: " << std::this_thread::get_id() << std::endl;
}

int main() {
    std::vector<std::unique_ptr<std::thread>> thr_grp;
    for(int i = 0; i < 5; ++i)
        thr_grp.emplace_back(std::make_unique<std::thread>(threadWorker));

    for(auto& e : thr_grp)
        e->join();
    return 0;
}

另一种方法是使用默认构造值构造和填充std::vector并稍后分配值:

std::vector<std::unique_ptr<std::thread>> thr_grp(5);
for(auto& e : thr_grp)
    e = std::make_unique<std::thread>(threadWorker);

上面的代码将使用移动语义,您不必使用std::move明确指出它。