【问题标题】:Do I need to use a mutex to protect access to an array of mutexes from different threads?我是否需要使用互斥锁来保护不同线程对互斥锁数组的访问?
【发布时间】:2020-03-06 00:58:23
【问题描述】:

假设我有一堆文件,以及一个数组,每个文件都有一个互斥锁。现在我有不同的线程从随机文件中读取,但首先他们需要从数组中获取锁。在获取特定文件的互斥锁之前,我是否应该锁定必须获取的整个数组?

【问题讨论】:

  • 你在写这个数组吗?它实际上是一个数组,还是可以像向量一样在内存中调整大小和移动的东西?
  • 没有数据争用锁数组,因为一个线程无论如何都会锁定,即使两个线程都已经索引了数组。

标签: c++ arrays concurrency locking mutex


【解决方案1】:

不,但是您所做的是将这些互斥锁所在的内存带入每个线程,因为您故意将互斥锁关闭。

让其他线程访问内存远离其他单独线程处理的内容。

将每个线程与尽可能紧密打包(但对齐)的数据关联起来,并且尽可能少地使用cache lines。一个互斥体和一个数据集 - 与其他工作线程需要访问的位置相去甚远。

您可以使用自制的std::hardware_constructive_interference_size 轻松测量效果,例如 ... 64(流行,非科学,但常见)。

以这样一种方式分隔数据,使其他线程不需要接触这 64 个(或您想出的任何数字)字节内的数据。

这是一种“不开玩笑?”的体验。


64 这个数字几乎是任意的。我可以使用该常量编译一个程序——但它不会被翻译成对不同目标平台有意义的东西——它会保持 64。这是一个最好的猜测。

Understanding std::hardware_destructive_interference_size and std::hardware_constructive_interference_size

【讨论】:

    【解决方案2】:

    不,在不同线程中访问数组的不同元素不会导致数据争用,并且互斥锁可以被多个不同步的线程使用,因为它必须能够实现其目的。

    您不需要为数组本身添加锁。对于只访问元素而不修改容器本身的标准库容器的成员函数也是如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-01
      • 2012-05-25
      • 1970-01-01
      • 2015-08-25
      • 2010-09-12
      • 2012-12-25
      • 2013-01-31
      • 2014-05-02
      相关资源
      最近更新 更多