boost :: asio async condition
La idea es poder reemplazar el código multiproceso con boost :: asio y un grupo de subprocesos, en un problema de consumidor / productor. Actualmente, cada hilo de consumidor espera en unboost::condition_variable
- Cuando un productor agrega algo a la cola, llama.notify_one
/notify_all
Notificar a todos los consumidores. Ahora, ¿qué sucede cuando (potencialmente) tienes 1k + consumidores? ¡Los hilos no escalan!
Decidí usarboost::asio
, pero luego me encontré con el hecho de que no tiene variables de condición. Y entoncesasync_condition_variable
nació:
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();
}
}
};
Básicamente, cada consumidor llamaríaasync_condition_variable::wait(...)
. Entonces, un productor eventualmente llamaríaasync_condition_variable::notify_one()
oasync_condition_variable::notify_all()
. Cada asa del consumidor se llamaría y actuaría según la condición o llamadaasync_condition_variable::wait(...)
otra vez. ¿Es esto posible o estoy loco aquí? ¿Qué tipo de bloqueo (exclusión mutua) se debe realizar, dado que se ejecutaría en un grupo de subprocesos?
P.S .: Sí, esto es más una RFC (Solicitud de comentarios) que una pregunta :).