Идея состоит в том, чтобы иметь возможность заменить многопоточный код на 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 ), чем вопрос :).