Es necesario el mutex para diferentes desplazamientos en la memoria de almacenamiento asignada

Estoy estableciendo el marco para una herramienta que generará una tabla de datos binarios. Tengo un plan para hacer este multiproceso para aprovechar al máximo los 24 núcleos a mi disposición. (Estoy estimando que el tiempo de pared para la generación de los datos será de aproximadamente 50 días, en un solo hilo). He hecho esto en el pasado utilizando el diseño de servidor / cliente con comunicación de socket, ya que necesitaba distribuirlo en varias máquinas.

En esta ocasión, estoy considerando un enfoque de máquina única / multihilo y estoy tratando de descubrir cómo hacerlo de la manera correcta.

El hilo maestro manejará la asignación de tareas a cada hilo hijo y determinará el desplazamiento en la memoria asignada.

Cada hilo escribirá en un rango de direcciones único dentro de la memoria asignada. Debido a que estos bloques nunca se superpondrán entre los registros, dos subprocesos nunca intentarán escribir el mismo desplazamiento.

{Meta Data} {Rec1} {Rec2} {Rec3} {Rec4} {...} {...} {...}

void computeRecord(void *taskInput) { struct TaskData *taskData = (TaskData *)(taskInput); RecordData data; // A huge long computation block to populate data // (4-5 second run time) long record_id = taskData->record_id; char *buffer = taskData->start_buffer; // mutex lock needed here ?? int n_bytes = sizeof(RecordData) memcpy( (char *)(buffer+record_id*n_bytes), (char *)(&recordData) n_bytes); // mutex unlock here ? } 

Configuración larga. Pregunta corta ¿Es el mutex necesario en este caso?

Para obtener el mejor rendimiento, querrá que sus datos se alineen con las líneas de caché; esto evitará que los diferentes núcleos de la CPU “reboten” las líneas de caché entre sí.

Pero, independientemente de eso, mientras hablemos de bytes separados que interactúen de forma independiente, no se necesita protección. Solo si más de un hilo accede al mismo byte [también se aplica al acceder a múltiples bytes, por supuesto].

Edición: esta statement, por supuesto, solo es cierta si el procesador tiene direccionamiento de bytes. El procesador que viene a la mente que no lo hace es Alpha, pero puede haber otros. (Edit2: No, no importa en el comstackdor compatible con C ++ 11, depende del comstackdor tratar el direccionamiento de bytes de una manera segura para subprocesos)