bru*_*ery 6 c++ multithreading boost boost-asio
我们的想法是能够在消费者/生产者问题上用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();
}
}
};
Run Code Online (Sandbox Code Playgroud)
基本上,每个消费者都会打电话async_condition_variable::wait(...).然后,制作人最终会打电话async_condition_variable::notify_one()或async_condition_variable::notify_all().将调用每个消费者的句柄,并且可以根据条件行事或async_condition_variable::wait(...)再次致电.这是可行的还是我在这里疯了?应该执行什么样的锁定(互斥),因为这将在线程池上运行?
PS:是的,这更像是一个RFC(征求意见)而不是一个问题:).
列出事件发生时需要完成的事情。有一个函数可以将某些内容添加到该列表中,还有一个函数可以从该列表中删除某些内容。然后,当事件发生时,让线程池处理现在需要完成的作业列表。您不需要专门等待事件的线程。
| 归档时间: |
|
| 查看次数: |
2243 次 |
| 最近记录: |