Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在分配的堆内存中,不同的偏移量是否需要互斥_C++_C_Multithreading_Mutex - Fatal编程技术网

C++ 在分配的堆内存中,不同的偏移量是否需要互斥

C++ 在分配的堆内存中,不同的偏移量是否需要互斥,c++,c,multithreading,mutex,C++,C,Multithreading,Mutex,我正在为生成二进制数据表的工具奠定框架。我计划让这个多线程系统充分利用我所拥有的24个内核。(我估计生成数据的时间大约为50天——在一个线程中)。我过去曾使用服务器/客户端设计和套接字通信来实现这一点,因为我需要将其分布到多台机器上 这一次,我正在研究一种单机/多线程方法,并试图找出正确的方法 主线程将处理分配给每个子线程的任务,并确定分配内存中的偏移量 每个线程将写入分配内存中的唯一地址范围。因为这些块在记录之间永远不会重叠,所以没有两个线程会尝试写入相同的偏移量 长时间设置。简短的问题。在

我正在为生成二进制数据表的工具奠定框架。我计划让这个多线程系统充分利用我所拥有的24个内核。(我估计生成数据的时间大约为50天——在一个线程中)。我过去曾使用服务器/客户端设计和套接字通信来实现这一点,因为我需要将其分布到多台机器上

这一次,我正在研究一种单机/多线程方法,并试图找出正确的方法

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

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


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

为了获得最佳性能,您需要将数据与缓存线对齐-这将避免不同的CPU内核在彼此之间“跳跃”缓存线

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

编辑:当然,只有当处理器具有字节寻址时,此语句才为真。想到的处理器不是Alpha,但可能还有其他处理器。
(Edit2:不,在兼容C++11的编译器中不重要,由编译器以线程安全的方式处理字节寻址)

我认为不需要,但可能有一些微妙之处,所以我不会回答。我不想让一个50计算日的任务完全存在于内存中。这一计算级别:生成的位应该很容易保存到磁盘,而不会影响带宽,这样就可以轻松收集部分运行,并将消耗与生产分开。然而,对于您的问题,如果您的偏移量在大多数体系结构上合理对齐,则不需要互斥。您是否想过使用OpenMP:这正是它设计用来解决的那种并行性什么计算如此缓慢?很奇怪。@Yakk,注意通过在24个内核上执行多线程,挂钟时间应该减少到2天。这就是说,我确实计划每隔一个小时左右检查一次数据(为此,我想我将使用一个信号量在写入缓冲区之前停止所有线程)。不幸的是,我无法控制数据表的结构(或其中包含的记录。我正在为一个将接口定义到数据中的应用程序生成数据。您是在断言没有任何处理器的内存读/写一次大于一个字节?@Yakk:正确,我添加了一条声明。在多线程程序中写入两个不同的地址是很容易的由标准定义。如果CPU不能进行字节寻址,编译器就必须担心该做什么。任何其他事情都会导致无法编写正确的程序:目前的共识似乎是编译器负责确保正确处理对不同偏移量的写入。
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 ?
}