当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《是否需要互斥锁用于将不同的偏移量分配到分配的堆内存中》经验,为你挑选了1个好方法。

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

这一次,我正在研究一种机器/多线程方法,并试图找出如何以正确的方式做到这一点.

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

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

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

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



1> Mats Peterss..:

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

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

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


标准很好地定义了在多线程程序中写入两个不同的地址.如果CPU无法进行字节寻址,则编译器必须担心该怎么做.任何其他东西都会使编写正确的程序变得不可能
[关于该主题的问题](http://stackoverflow.com/questions/34706564/writing-to-different-offsets-in-array-always-well-defined/34706615?noredirect=1#34706615):迄今为止的共识似乎是编译器负责确保正确处理对不同偏移的写入.
推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有