Идея состоит в том, чтобы иметь возможность заменить многопоточный код на boost :: asio и пул потоков в проблеме потребителя / производителя. В настоящее время каждый потребительский поток ожидает boost::condition_variable
- когда производитель что-то добавляет в очередь, он вызывает _2 _ / _ 3_, чтобы уведомить всех потребителей. Что происходит, когда у вас (потенциально) более 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 (запрос комментариев), чем вопрос :).