gpt4 book ai didi

c++ - boost::asio io_service 线程池

转载 作者:IT老高 更新时间:2023-10-28 22:27:55 25 4
gpt4 key购买 nike

为 io_service 设置线程池的正确用法是什么?这两条语句来自 documentation把我甩了:

io_service::run

A normal exit from the run() function implies that the io_service object is stopped (the stopped() function returns true). Subsequent calls to run(), run_one(), poll() or poll_one() will return immediately unless there is a prior call to reset().

io_service::reset

This function must be called prior to any second or later set of invocations of the run(), run_one(), poll() or poll_one() functions when a previous invocation of these functions returned due to the io_service being stopped or running out of work.

这是我目前正在做的事情:

boost::thread_group     m_Threads;
boost::asio::io_service m_IoService;
boost::barrier m_Barrier(numThreads);

for( unsigned int i = 0; i < numThreads; ++i )
{
m_Threads.create_thread(
[&]()
{
for(;;)
{
m_IoService.run();

if( m_Barrier.wait() ) // will only return true for 1 thread
{
m_IoService.reset();
}
m_Barrier.wait();
}
});
}

m_IoService.stop();
m_Threads.interrupt_all();
m_Threads.join_all();

如果我只是将 m_IoService.run() 放入无限循环中,一切似乎都可以正常工作(文档似乎表明 不应该 是这种情况)。 正确的方法是什么?

最佳答案

run() 是一个阻塞调用,将在返回之前执行所有可以执行的事件。只有在没有更多事件需要处理时才会返回。一旦返回,您必须在再次调用 run() 之前调用 io_service 上的 reset()

您可以有多个线程调用 run() - 这不是问题,只要 io_service 有一些工作要做,您就不需要无限循环。正常的模式是在 io_service 上创建一个 work 对象,这将强制 run() 永远不会返回。这确实意味着您必须在完成后显式调用 io_service 上的 stop(),因为它永远不会自然退出。

如果您在 io_service 上设置 work,它永远不会自然退出,因此您永远不需要调用 reset()

work some_work(m_IoService); // this will keep the io_service live.

for( unsigned int i = 0; i < numThreads; ++i )
{
m_Threads.create_thread(
[&]()
{
m_IoService.run();
});
}

现在所有线程都在 io_service 上调度事件

// Now post your jobs
m_IoService.post(boost::bind(...)); // this will be executed in one of the threads
m_IoService.post(boost::bind(...)); // this will be executed in one of the threads
m_IoService.post(boost::bind(...)); // this will be executed in one of the threads

m_IoService.stop(); // explicitly stop the io_service
// now join all the threads and wait for them to exit

关于c++ - boost::asio io_service 线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7957059/

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