我试图填充我的载体:
...
auto f = std::bind(&ScheduledExecutor::complete_after, std::placeholders::_1, std::placeholders::_2);
threadPoolVector.push_back(std::thread(f, this, delay));
...
如何在将线程推送到矢量之前分离添加线程?
答案 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::at
或std::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);