分配的堆内存中的不同偏移量是否需要互斥锁

Is mutex needed for different offsets into allocated heap memory

我正在构建一个将生成二进制数据的工具框架 table。我计划让这个多线程充分利用我可以支配的 24 个内核。 (我估计在单个线程中生成数据的时间大约为 50 天。)。我过去曾使用 server/client 设计和套接字通信来完成此操作,因为我需要将其分布在多台机器上。

这一次,我正在研究一种 machine/multi-threaded 方法,并试图弄清楚如何以正确的方式做到这一点。

主线程将处理分配给每个子线程的任务,并确定分配内存中的偏移量。

每个线程将写入已分配内存中的唯一地址范围。因为这些块永远不会在记录之间重叠,所以没有两个线程会尝试写入相同的偏移量。

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 ?
}

设置时间长。简短的问题。在这种情况下是否需要互斥锁?

为了获得最佳性能,您需要将数据与 cache-lines 对齐 - 这将避免 "bouncing" cache-lines 之间的不同 CPU 核心.

但无论如何,只要我们谈论的是独立交互的单独字节,就不需要保护。仅当多个线程正在访问同一字节时[当然也适用于访问多个字节]。

编辑:这个说法当然只有在处理器有字节寻址的情况下才是正确的。想到的不是 Alpha 的处理器,但可能还有其他处理器。 (Edit2:不,在 C++11 兼容编译器中无关紧要,由编译器以 thread-safe 方式处理字节寻址)