分配的堆内存中的不同偏移量是否需要互斥锁
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 方式处理字节寻址)
我正在构建一个将生成二进制数据的工具框架 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 方式处理字节寻址)