这个想法是能够在消费者/生产者问题上用 boost::asio 和线程池替换多线程代码。当前,每个消费者线程都在等待boost::condition_variable
- 当生产者向队列中添加某些内容时,它会调用notify_one
/notify_all
来通知所有消费者。现在,当您(可能)拥有 1k+ 消费者时会发生什么?线程不会扩展!
我决定使用boost::asio
,但后来我发现它没有条件变量。然后async_condition_variable
诞生了:
class async_condition_variable
{
private:
boost::asio::io_service& service_;
typedef boost::function<void ()> async_handler;
std::queue<async_handler> waiters_;
public:
async_condition_variable(boost::asio::io_service& service) : service_(service)
{
}
void async_wait(async_handler handler)
{
waiters_.push(handler);
}
void notify_one()
{
service_.post(waiters_.front());
waiters_.pop();
}
void notify_all()
{
while (!waiters_.empty()) {
notify_one();
}
}
};
基本上,每个消费者都会调用async_condition_variable::wait(...)
. 然后,生产者最终会调用async_condition_variable::notify_one()
or async_condition_variable::notify_all()
。每个消费者的句柄都会被调用,并且会根据条件采取行动或async_condition_variable::wait(...)
再次调用。这是可行的还是我在这里疯了?鉴于这将在线程池上运行,应该执行哪种锁定(互斥锁)?
PS:是的,这更像是一个 RFC(征求意见)而不是一个问题 :)。