C ++ 11 sin bloqueo único productor único consumidor:cómo evitar la espera ocupada

C ++ 11 sin bloqueo único productor único consumidor:cómo evitar la espera ocupada

Luego, el valor se enviará a la cola, pero no se procesará hasta que se ponga en cola otro valor después de establecer el indicador. Usted (o sus usuarios) pueden decidir si eso es aceptable. Esto se puede evitar usando candados, pero van en contra de sus requisitos.

El código puede fallar si el subproceso en ejecución está a punto de finalizar y establece working_ = false; pero no ha dejado de ejecutarse antes de que se ponga en cola el siguiente valor. En ese caso, su código llamará a operator=en el hilo en ejecución, lo que resultará en una llamada a std::terminate de acuerdo con la documentación vinculada.

Agregando worker_.join() antes de asignar el trabajador a un nuevo hilo debería evitar eso.

Otro problema es que queue_.push puede fallar si la cola está llena porque tiene un tamaño fijo. Actualmente, simplemente ignora el caso y el valor no se agregará a la cola completa. Si espera a que la cola tenga espacio, no obtendrá una cola rápida (en el caso extremo). Podrías tomar el bool devuelto por push (que indica si tuvo éxito) y devolverlo desde enqueue . De esa manera, la persona que llama puede decidir si quiere esperar o descartar el valor.

O use una cola de tamaño no fijo. Boost tiene esto que decir sobre esa elección: