boost :: asio异步条件

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(征求意见)而不是一个问题:).

Dav*_*rtz 3

列出事件发生时需要完成的事情。有一个函数可以将某些内容添加到该列表中,还有一个函数可以从该列表中删除某些内容。然后,当事件发生时,让线程池处理现在需要完成的作业列表。您不需要专门等待事件的线程。