如何将线程添加到std :: vector <std :: thread> </std :: thread>

时间:2015-04-19 13:18:06

标签: multithreading c++11

我试图填充我的载体:

...    
auto f = std::bind(&ScheduledExecutor::complete_after, std::placeholders::_1, std::placeholders::_2);
threadPoolVector.push_back(std::thread(f, this, delay));
...

如何在将线程推送到矢量之前分离添加线程?

2 个答案:

答案 0 :(得分:5)

使用C ++ 11或更高版本,您可以利用移动语义。当它们不是绝对必要时,最好避免使用指针,甚至是智能指针。

您可以创建std::thread对象并使用std::move函数移动它:

std::vector<std::thread> pool;
std::thread th(f);
pool.push_back(std::move(th));

您还可以使用std::vector::emplace_back函数直接在std::thread实例中创建std::vector的对象。

然后您可以使用for加入或分离它们:

for (auto& t : pool)
    t.detach(); // or t.join() to join it

或使用std::vector::atstd::vector::operator[]函数访问每个元素。

答案 1 :(得分:3)

不要拆卸它们。您可以将std::shared_ptr用于vector中的线程:

std::vector<std::shared_ptr<std::thread>> threadPoolVector;
....
auto f = std::bind(&ScheduledExecutor::complete_after, std::placeholders::_1, std::placeholders::_2);
threadPoolVector.push_back(std::make_shared<std::thread>(f, this, delay));

如果由于某种原因你不能使用共享指针,你可以使用emplace_back()向量方法将你的线程移动到vector:

std::vector<std::thread> threadPoolVector;
...
auto f = std::bind(&ScheduledExecutor::complete_after, std::placeholders::_1, std::placeholders::_2);
threadPoolVector.emplace_back(f, this, delay);