Aquí se explica cómo escribir un lock- cola libre en C++:
http://www.ddj.com/hpc-high-performance-computing/210604448
Pero cuando se dice "hilo A no debe bloquear", ¿está seguro de que es el requisito? Windows no es un sistema operativo en tiempo real (y tampoco lo es Linux, en uso normal). Si desea que el Subproceso A pueda usar toda la memoria disponible del sistema, entonces debe asignar memoria (o esperar mientras que otra persona lo hace). El sistema operativo en sí no puede proporcionar garantías de tiempo mejores que las que tendría si el lector y el escritor tomaran un bloqueo en proceso (es decir, un mutex no compartido) para manipular la lista. Y el peor caso de agregar un mensaje va a tener que ir al sistema operativo para obtener memoria.
En resumen, hay un motivo por el que las colas que no te gustan tienen una capacidad fija, es para que no tengan que asignar memoria en el hilo supuestamente de baja latencia.
Por lo tanto, el código de bloqueo generalmente será menos bloqueado, pero debido a la asignación de memoria no está garantizado, y el rendimiento con un mutex no debería ser tan lamentable a menos que tenga una enorme secuencia de eventos para procesar (por ejemplo, está escribiendo un controlador de red y los mensajes son paquetes de Ethernet entrantes).
Así, en pseudo-código, lo primero que iba a tratar sería:
Writer:
allocate message and fill it in
acquire lock
append node to intrusive list
signal condition variable
release lock
Reader:
for(;;)
acquire lock
for(;;)
if there's a node
remove it
break
else
wait on condition variable
endif
endfor
release lock
process message
free message
endfor
Sólo si se demuestra que introducir retrasos inaceptables en el hilo escritor iba a ir a bloquear código libre, (a menos que tenga una cola adecuada que ya esté por ahí).
¿Qué biblioteca de hilos está utilizando? pthreads? –
boost :: thread y algunos bits del código específico de la plataforma aquí y allá –
Su objetivo podría resultar en quedarse sin memoria ya que no permite que el hilo del escritor bloquee o suelte elementos. Por lo tanto, si alcanza un límite de tamaño crítico de la cola, debe decidir si eliminar elementos o bloquear el hilo del escritor. De lo contrario, se sueltan elementos indirectamente porque el programa falla :-) – mmmmmmmm