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

我正在框架中放置一个生成二进制数据表的工具。 我计划让这个multithreading充分利用我所拥有的24个核心。 (我估计在一个线程中生成数据的时间大约为50天)。 我过去使用带有套接字通信的服务器/客户端设计完成了这项工作,因为我需要在多台计算机上进行分发。

这一次,我正在研究单机/multithreading方法,并试图找出如何以正确的方式做到这一点。

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

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

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

设置时间长。 简短的问题。 在这种情况下,互斥是必要的吗?

为了获得最佳性能,您需要将数据与缓存行对齐 – 这样可以避免不同的CPU内核在相互之间“弹跳”缓存行。

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

编辑:如果处理器具有字节寻址,则该语句当然是正确的。 想到的处理器不是Alpha,但可能还有其他处理器。 (编辑2:不,在兼容C ++ 11的编译器中无关紧要,由编译器以线程安全的方式处理字节寻址)