我在C++中使用构造“线程”,并在递归函数中创建可变数量的线程。我想让主线等待所有这些线程。我怎样才能做到这一点没有WaitForMultipleObjects?等待C++中的所有线程
回答
在cplusplus中查看example。他们用向量中的push_back()存储线程。最后你有循环加入。
std::vector<std::thread> threads;
//create threads
for (int i=1; i<=10; ++i)
threads.push_back(std::thread(increase_global,1000));
//wait for them to complete
for (auto& th : threads)
th.join();
为什么这是downvote的原因? –
不是我的投票,但它通常不如cppreference.com准确。 – MSalters
同意cppreference.com是更准确的,但没有矢量的例子
我不知道你的情况的细节,但这种方法可能对你有用:
using thread_vec = std::vector<std::thread>;
void batch_process(int n)
{
static std::mutex mtx;
std::lock_guard<std::mutex> lock(mtx);
std::cout << "process: " << n << '\n';
}
void recursive(thread_vec& tv, int n)
{
// do some stuff
tv.emplace_back(batch_process, n);
if(n > 0)
recursive(tv, n - 1);
}
int main(int, char* argv[])
{
thread_vec tv;
recursive(tv, 3);
for(auto&& t: tv)
t.join();
}
输出:
process: 1
process: 0
process: 2
process: 3
,将原子变量作为计数器,在启动新线程时增加变量,在线程完成后减少计数器。
int main() {
mutex m;
condition_variable cv;
atomic<int> counter = 0;
// .... in your recursive call
// increase counter when launching thread.
counter++;
thread t([](){
// do whatever
lock_guard<mutex> lk(m);
counter--;
cv.notify_all();
});
t.detach(); // no need to join anymore.
// .... end recursive call
unique_lock<mutex> lock(m);
cv.wait(lock, [](){ return counter == 0; });
}
并将轮询开销(通过一些'condition_variable.wait()'实现)添加到解决方案中? – mg30rg
@ mg30rg条件变量阻塞不轮询,线程连接也阻塞。 –
您也可以使用boost thread_group。它仅适用于boost线程,但它们与std :: thread的接口几乎相同(boost线程是C++ 11中标准库中线程的基础),并且一旦将所有线程添加到thread_group,只需在该组中调用join_all即可。你也可以实现你自己的thread_group类,与std :: thread一起工作,std :: thread会基本上完成已经建议的事情,并且使用线程对象或指针的向量,然后在循环中等待它们。
- 1. C#等待所有线程完成Main()
- 2. C++等待所有线程完成
- 3. java等待池中的所有线程
- 4. 如何等待所有线程完成
- 5. 试图等待所有线程完成
- 6. 等待所有工作线程结束
- 7. 如何等待所有线程完成?
- 8. 线程池等待所有64 [Leadtools]
- 9. 如何等待所有后台线程完成(在C#中)?
- 10. 线程在C“等待父”
- 11. C++等待多线程
- 12. C++ 11线程等待
- 13. C#等待和多线程
- 14. C#等待其他线程
- 15. C++线程等待时间
- 16. 等待多个线程(POSIX线程,C++)
- 17. 检测C中的等待线程Pthread
- 18. C#.NET等待所有线程完成并获得返回值
- 19. 等待所有子线程来完成(在C)
- 20. 等待线程
- 21. 多线程 - 等待所有线程发信号
- 22. 如何让主线程等待所有子线程完成?
- 23. 等待的线程
- 24. 在C++ 0x多线程中等待
- 25. 线程在C中使用WaitHandles等待#
- 26. 多线程 - 等待线程
- 27. 等待Executor中的所有线程完成?
- 28. 等待初始化池中的所有线程
- 29. 是否有可能要等待所有的线程在JMeter的
- 30. 等待所有线程完成的有用模式是什么?
将它们存储在[容器](http://en.cppreference.com/w/cpp/container)中并等待它们循环?使用['std :: thread'](http://en.cppreference.com/w/cpp/thread/thread)真的没有其他办法。如果你想成为便携式和符合标准。 –
我试图把它们放在一个向量中,但是当我执行push_back方法时,Visual Studio说线程不可复制 – Seba92
@ user3671840你可以使用智能指针而不是线程 - 例如'std :: vector >' –