Cuando hay un conjunto común de datos globales que deben compartirse entre varios procesos con subprocesos, generalmente he usado un token de subproceso para proteger el recurso compartido:

Editar: 22/7/15 (para incorporar atómica como una opción viable, según los comentarios de Jens)
Mi [Primera] pregunta es , en C, si escribo mis rutinas de tal manera que garantice que cada subproceso acceda a uno, y solo a un elemento de una matriz:

¿Hay alguna razón para pensar que el acceso asíncrono y simultáneo a diferentes índices de la misma matriz desprotegida (como se muestra en el diagrama) sería un problema?
Segunda pregunta: dado que un objeto al que se puede acceder como una entidad atómica, incluso en presencia de interrupciones asíncronas ( C99 - 7.14 Manejo de señales ), ¿el uso de atómicas sería un método efectivo para la protección de subprocesos para una variable desprotegida?
Editar (Aclaraciones para abordar las preguntas en los comentarios a este punto):
- Especificaciones para esta aplicación:
- Sistema operativo de destino: Windows 7/8/10
- Compilador: compatible con C99 (no se puede usar C11, que incluye el especificador de tipo _ Atomic() )
-H/W: familia Intel i7
Esto (que parece un estándar C de algún tipo) http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf dice:
NOTA 1 Dos subprocesos de ejecución pueden actualizar y acceder a ubicaciones de memoria separadas sin interferir entre sí
NOTA 13 Las transformaciones del compilador que introducen asignaciones a una ubicación de memoria potencialmente compartida que no sería modificada por la máquina abstracta generalmente están excluidas por este estándar, ya que tal asignación podría sobrescribir otra asignación por un subproceso diferente en casos en los que la ejecución de una máquina abstracta no haber encontrado una carrera de datos. Esto incluye implementaciones de asignación de miembros de datos que sobrescriben miembros adyacentes en ubicaciones de memoria separadas. Por lo general, también excluimos el reordenamiento de las cargas atómicas en los casos en que los átomos en cuestión puedan crear alias, ya que esto puede violar las reglas de "secuencia visible".
Según tengo entendido, esto evitaría las preocupaciones de quamrana y le garantizaría que las escrituras desprotegidas en ubicaciones de memoria separadas nunca deberían dar como resultado un comportamiento indefinido si no hay carrera de datos.
En C dependerá de tu plataforma, esa es tu combinación de compilador, arquitectura de procesador y sistema operativo.
Su compilador puede elegir cómo usar los registros internos y las instrucciones de la CPU para hacer que el ejecutable parezca cumplir con la intención del programa. Y C puede no saber nada sobre hilos. Por lo general, el trabajo del sistema operativo es proporcionar una biblioteca de subprocesos.
Puede haber procesadores que puedan realizar la escritura en un elemento de su matriz al leer un parche de memoria mucho más grande que solo un elemento, luego sobrescribir solo los bits correctos que forman un elemento dentro de los registros internos y luego volver a escribir todo el parche. Un programa de un solo subproceso funcionaría bien, pero dos o más subprocesos que se interrumpan entre sí podrían causar caos en la matriz.
Por otro lado, puede funcionar bien.
Y como se ha dicho, el acceso de solo lectura siempre está bien.
Además, Google es tu amigo. Encontró esta pregunta de stackoverflow.
Si cada subproceso accede a un elemento de matriz diferente, y solo el elemento que está "asignado", esto no debería ser un problema. Ambos escenarios anteriores son esencialmente equivalentes, ya que cada elemento de la matriz tiene su propia dirección.