Estoy tratando de diseñar una lista vinculada en C++ que permita el acceso simultáneo. Claramente, usar un solo bloqueo para esta lista es extremadamente ineficiente ya que las áreas disjuntas pueden actualizarse en paralelo. Ahora, ¿cuáles son mis opciones además de almacenar un bloqueo por nodo?lista de enlaces simultáneos
Además, ¿una versión sin bloqueo sería una mejor opción en este caso? Cualquier enlace relevante, alguien?
EDIT: Gracias por las respuestas personas. Un par de cosas que quisiera agregar:
- ¿Qué tal si guardo N bloqueos para cada M nodos en lugar de 1: 1 de bloqueo: proporción de nodos? Algunos hilos esperarían, pero es una especie de intercambio. ¿Qué piensas?
- Si intento encontrar algún nodo en esta lista vinculada, parece que todos los mutex deben estar bloqueados. Esto es un problema, ya que bloquear y desbloquear todos los mutexes lleva mucho tiempo. ¿Alguien tiene una mejor alternativa?
- Estoy abierto a algoritmos sin bloqueo. Pero, ¿cómo uso CAS en el buen viejo C++ sin usar el ensamblado? Escuché que gcc tiene algunos atributos __sync que hacen un trabajo similar pero no estoy seguro.
- Con un enfoque sin bloqueo, ¿cómo se hace una búsqueda en la lista vinculada?
Considere utilizar algo que ya existe en lugar de reinventar esta rueda. Un ejemplo podría ser 'concurrent_vector' del TBB de Intel: http://www.threadingbuildingblocks.org/ –
También puede haber una solución de Boost, no estoy seguro. –