gpt4 book ai didi

c++ - 如何仅在所有任务完成时使用 C++ 中的 boost 将新任务添加到线程池

转载 作者:搜寻专家 更新时间:2023-10-31 02:23:21 24 4
gpt4 key购买 nike

boost::asio::io_service ioService;
boost::thread_group threadpool;
boost::barrier barrier(5);
boost::asio::io_service::work work(ioService);
threadpool.create_thread(boost::bind(&boost::asio::io_service::run, &ioService)); //Thread 1
threadpool.create_thread(boost::bind(&boost::asio::io_service::run, &ioService)); //Thread 2
threadpool.create_thread(boost::bind(&boost::asio::io_service::run, &ioService)); //Thread 3 threadpool.create_thread(boost::bind(&boost::asio::io_service::run, &ioService)); //Thread 4

while (true)
{
{
boost::lock_guard<boost::recursive_mutex> lock(mutex_);
map::iterator it = m_map.begin();
while (it != m_map.end())
{
ioService.post(boost::bind(&ProcessFun, this, it));
++it;
}

ioService.run(); <-- main thread is stuck here..
}

}

我希望能够知道分配给线程池的所有任务都已经完成,只有在再次将任务分配给线程池之后。

只要线程正在处理任务,我就不想释放锁。有什么方法可以确保所有分配的任务都已完成?然后才继续?

最佳答案

根据 boost asio 文档,最简单的方法是调用 ioService.run():

The io_service object's run() function will not exit while work is underway. It does exit when there is no unfinished work remaining.

顺便说一下,如果不查看更多程序就很难确定这一点,但看起来您正试图破坏 asio 的主要目的。您正在序列化成批任务。如果在某种程度上重要的是批处理#1 中的所有任务在批处理#2 中的任何任务开始之前被完全处理,那么这可能是有道理的,但这是一种奇怪的用法。

另外要小心,如果 batch#1 任务的任何处理程序尝试添加新任务,它们可能会在尝试获取互斥锁上的锁时发生死锁。

关于c++ - 如何仅在所有任务完成时使用 C++ 中的 boost 将新任务添加到线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29415476/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com