【发布时间】:2021-06-21 12:55:12
【问题描述】:
我正在尝试使用 boost thread_pool 在 while 循环中继续运行相同的函数,但遇到了一些问题。这是我的代码的 sn-p。当我运行它时,我的程序开始消耗内存,直到我的计算机没有内存为止。从调试来看,我认为这是因为队列增长得太快了,函数处理得不够快。我尝试将 pool.wait() 和 pool.join() 放入循环中,这适用于第一次迭代,但之后的每次迭代,它都不会等待并且工作没有被处理。
以前我使用并行 for 循环来调用我的函数,这很好用。但是随着我添加了更多需要处理的函数,我开始需要能够限制一次处理多少个函数,但我仍然希望将所有内容都排队,以便一切都完成。这就是为什么我有 6 个函数,但池大小为 4。
编辑:我想基本上将 6 个函数分批排队,并等待所有 6 个函数完成,然后再将下一组 6 个函数添加到队列中。 pool.wait() 和 pool.join() 的问题是它们设置了一个内部标志,阻止线程继续工作。而且我找不到重置此标志的方法。
driver()
{
auto foo1 = [&](){...};
auto foo2 = [&](){...};
auto foo3 = [&](){...};
auto foo4 = [&](){...};
auto foo5 = [&](){...};
auto foo6 = [&](){...};
boost::asio::thread_pool pool(4);
while(isRunning)
{
boost::asio::post(pool, [&foo1] {foo1(); });
boost::asio::post(pool, [&foo2] {foo1(); });
boost::asio::post(pool, [&foo3] {foo1(); });
boost::asio::post(pool, [&foo4] {foo1(); });
boost::asio::post(pool, [&foo5] {foo1(); });
boost::asio::post(pool, [&foo6] {foo1(); });
//boost::asio::post(pool, foo1);
//boost::asio::post(pool, foo2);
//boost::asio::post(pool, foo3);
//boost::asio::post(pool, foo4);
//boost::asio::post(pool, foo5);
//boost::asio::post(pool, foo6);
//pool.join();
//pool.wait();
}
pool.join();
}
【问题讨论】:
标签: c++ boost threadpool boost-asio