boost ::асинхронное состояние asio

Идея состоит в том, чтобы иметь возможность заменить многопоточный код на boost ::asio и пул потоков для решения проблемы потребителя/производителя. В настоящее время каждый потребительский поток ожидаетboost::condition_variable-когда производитель добавляет что-то в очередь, он вызывает notify_one/notify_all, чтобы уведомить всех потребителей. Что произойдет, если у вас (потенциально )будет более 1000 потребителей? Темы не масштабируются!

Я решил использовать 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()или async_condition_variable::notify_all(). Будет вызван дескриптор каждого потребителя, и он либо будет действовать в соответствии с условием, либо снова вызовет async_condition_variable::wait(...). Это возможно, или я схожу с ума здесь? Какие блокирующие (мьютексы )следует выполнять, учитывая тот факт, что это будет выполняться в пуле потоков?

P.S. :Да, это больше RFC (Request for Comment ), чем вопрос :).

6
задан Sam Miller 10 July 2012 в 00:55
поделиться