Respuesta: ninguna. De eso no se tratan esas secciones de The Art of Multiprocessor Programming de Herlihy y Shavit. En los capítulos sobre exclusión mutua, Herlihy y Shavit no le ofrecen alternativas a la pthread
biblioteca, le muestran cómo se implementa el equivalente de la pthread
biblioteca.
El capítulo 2 de Herlihy y Shavit se titula "Exclusión mutua". Ofrece una variedad de algoritmos clásicos para implementar el equivalente pthread_mutex_lock()
con solo memoria compartida secuencialmente consistente. Mis respuestas https://cs.stackexchange.com/a/12632/7459 y https://cs.stackexchange.com/a/30249/7459 discuten la importancia de estas implementaciones y tienen un puntero a uno que es práctico para usar en máquinas que no tienen operaciones de sincronización de hardware incorporadas. (Documento de Lamport de 1987 en ACM Trans. Sobre sistemas informáticos).
El Capítulo 7 de Herlihy y Shavit ofrece una variedad de implementaciones de bloqueo de giro y cola del equivalente de pthread_mutex_lock()
, y el Capítulo 8 se expande para discutir pthread_cond_t
(variables de condición), pthread_rwlock_t
(bloqueos de lector / escritor), y toca brevemente semaphores
. Puede haber situaciones en las que pthread_rwlock_t
podría usarse como una alternativa pthread_lock_t
por razones de rendimiento (pero generalmente no) y en Posix debe usar semaphores
para la sincronización entre procesos.
Los capítulos 9 a 16 tratan principalmente sobre aplicaciones (varios tipos de contenedores concurrentes). El capítulo 17 discute brevemente el equivalente de pthread_barrier_t
.
Dicho todo esto, Herlihy y Shavit son dos de los defensores más vocales de la memoria transaccional y una variedad de tipos de sincronización sin bloqueo (y sin esperas). Estas técnicas están pensadas como alternativas a la exclusión mutua en ciertos casos. Herlihy y Shavit rocian varias implementaciones sin bloqueo en los capítulos 9 a 16, y luego entran en detalles sobre la memoria transaccional en el Capítulo 18.
La memoria transaccional y otras técnicas de sincronización sin bloqueo están destinadas a resolver el problema de que algunos algoritmos mal diseñados requieren subprocesos para mantener sus secciones críticas durante mucho tiempo. La memoria transaccional y la sincronización verdaderamente sin bloqueo no son actualmente alternativas prácticas en una situación real, pero las técnicas para transformar estructuras de datos de bloqueo en estructuras de datos sin bloqueo son útiles en la práctica para minimizar la cantidad de tiempo que una estructura de datos de bloqueo permanece en su estado crítico. sección. (A menudo puede reducir el tamaño de la sección crítica a solo un par de instrucciones de la máquina).