【问题标题】:Default vector constructor with a unique_ptr and thread具有 unique_ptr 和线程的默认向量构造函数
【发布时间】:2017-11-23 13:51:56
【问题描述】:

调用创建std::unique_ptr 持有线程的“n”个元素的默认向量构造函数的正确方法是什么。

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语义?

【问题讨论】:

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


    【解决方案1】:

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

    您可以将emplace 元素转换为默认构造的std::vector&lt;std::unique_ptr&lt;std::thread&gt;&gt;,如下例所示:

    #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明确指出它。

    【讨论】:

    • 我通常更喜欢第二个
    猜你喜欢
    • 2017-09-24
    • 2015-07-07
    • 1970-01-01
    • 2016-08-08
    • 2014-08-04
    • 2017-09-27
    • 1970-01-01
    • 2018-11-30
    • 2016-02-08
    相关资源
    最近更新 更多