【问题标题】:What is the Advantage of Using an Array of `mutex`s on a Critical Region?在关键区域上使用“互斥锁”数组有什么好处?
【发布时间】:2018-08-24 06:15:37
【问题描述】:

我正在查看一些将mutexs 数组用于某些代码的关键区域的代码:

void alter(int item_nr)
{
    pthread_mutex_lock(&(items_sem[item_nr]));
    items[item_nr] = 1; // Assume this array is in shared memory
    pthread_mutex_unlock(&(items_sem[item_nr]));
}

进入这个函数的每个线程都有一个item_nr,它传递给函数。进入该函数的线程数与数组中的项数完全相同,因此每个线程只访问一个项,并且每次进入该线程时访问的是同一个项。

我是并行编码的新手,所以这个概念对我来说没有多大意义。我想你只需要一个mutex 来保护一些共享内存,这样其他线程就无法访问它,但是使用mutexs 数组,它不会只锁定一个线程而不锁定其他线程吗?

【问题讨论】:

  • 为什么不使用std::mutex
  • @TheUnknown,我更喜欢这样,但这不是此代码的选项。不是我的选择。

标签: c++ multithreading pthreads


【解决方案1】:

对每个数组元素使用不同的互斥锁意味着如果两个线程想要访问数组的不同元素,它们不必相互等待。如果两个线程都试图访问同一个item_nr,上面的代码只会导致一个线程等待另一个线程。

如果你保证每个不同的线程已经访问了数组的不同元素,那么我不确定你为什么需要任何并发控制。

【讨论】:

  • 因此,在这种情况下,可以由多个线程访问共享内存,因为数组对于每个单元格具有不同的数组内存位置,从技术上讲,只要每个线程不存在,每个单元格就可以成为单独的内存一次访问其他单元格(这是代码阻止的)。对吗?
  • 是的,让不同的线程访问不同的内存位置应该没问题。这可能有点危险,因为如果您假设不同的线程从不访问同一个元素是错误的,或者如果您的一个线程删除或移动了数组,那么可能会出现问题。
  • @MartinCook array 在内存中是连续的,不能移动。您需要关心的可能是机器指令集的改组,这可以通过在 windows 或 unix 中使用一些可用的内置函数来解决。
  • @TheUnknown 无法移动当然可以。当前发布的最小代码并不排除在其他地方使用类似realloc() 的代码来重新定位items 数组(如果需要调整其大小)。我们不知道 items 究竟是什么,也不知道它是如何创建的。
猜你喜欢
  • 1970-01-01
  • 2012-03-12
  • 2011-04-13
  • 2010-10-22
  • 1970-01-01
  • 2014-09-26
  • 2011-01-20
  • 1970-01-01
相关资源
最近更新 更多