Cola libre de múltiples productores Única consumidora (MPSC) La cola es uno de los algoritmos de bloqueo más fáciles de implementar.
La implementación más básica requiere una simple lista de enlace único sin bloqueo (SList) con solo push() y flush(). Las funciones están disponibles en la API de Windows como InterlockedFlushSList() e InterlockedPushEntrySList() pero son muy fáciles de rodar por su cuenta.
Múltiples elementos de empuje del productor() en el SList usando un CAS (interbloqueo de comparación y cambio).
El consumidor individual hace un color() que intercambia el encabezado del SList con un NULL usando un intercambio XCHG (intercambio entrelazado). El consumidor tiene una lista de artículos en el orden inverso.
Para procesar los elementos en orden, simplemente debe invertir la lista devuelta por flush() antes de procesarla. Si no le importa el orden, simplemente puede recorrer la lista de inmediato para procesarlo.
Dos notas si saca sus propias funciones:
1) Si usted está en un sistema con pedidos de memoria débil (es decir, PowerPC), hay que poner una "liberación barrera de memoria" al principio del empuje() función y una "barrera de memoria aquire" al final de la función flush().
2) Puede simplificar y optimizar considerablemente las funciones porque el problema ABA con SLists ocurre durante la función pop(). No puede tener problemas ABA con un SList si solo usa push() y flush(). Esto significa que puede implementarlo como un único puntero muy similar al código sin bloqueo y no es necesario contar con un contador de secuencia de prevención de ABA.
necesita adquirir/liberar barreras de memoria en las configuraciones ready = true/false y owned = false. Al igual que en CompareAndSwap, pero generalmente eso es solo parte de la función. – tony
Eso depende completamente de las reglas de ordenamiento de memoria de su arquitectura.Si las escrituras no se reordenan con respecto a otras escrituras emitidas desde el mismo procesador (que es común), entonces la barrera de memoria con 'CompareAndSwap' es suficiente para la corrección. – caf