【问题标题】:Using many mutex locks使用许多互斥锁
【发布时间】:2010-05-05 12:52:08
【问题描述】:

我有一个大型树结构,多个线程同时在其上工作。理想情况下,我想为每个单元格设置一个单独的互斥锁。

我在bits/pthreadtypes.h 中查看了pthread_mutex_t 的定义,它相当短,所以在我的情况下内存使用应该不是问题。

但是,当只为 8 个线程使用多个(比如说几千个)不同的 pthread_mutex_ts 时,是否存在性能损失?

【问题讨论】:

  • 一棵树上几千是..有点可疑..但很难说没有实际看到它。你能发布足够多的代码来展示一个相当全面的例子吗?

标签: c linux pthreads hpc


【解决方案1】:

如果您非常频繁地锁定和解锁,可能会受到惩罚,因为获取和释放锁确实需要一些时间,如果锁被争用,可能需要相当长的时间。

在这样的结构中使用多个锁时,您必须非常具体地了解每个锁实际锁定的内容,并确保小心 AB-BA 死锁。例如,如果您在锁定操作期间更改树的结构,则需要以一致的顺序锁定所有将更改的节点,并确保处理后代的线程不会混淆。

如果您有大量锁,分布在内存中,缓存问题可能会导致性能问题,具体取决于架构,因为锁定操作通常会使至少部分缓存无效。

您最好的选择可能是实现一个简单的锁定结构,然后对其进行分析,然后在必要时对其进行改进以提高性能。我不确定你对树做了什么,但如果你希望阅读的内容比更新的多得多,那么一个好的起点可能是整个树的单个读写器锁。

“我们应该忘记小的效率,比如说大约 97% 的时间:过早的优化是万恶之源。” ——唐纳德·克努斯

【讨论】:

    【解决方案2】:

    需要说明您的锁定/访问模式才能正确评估这一点。如果每个线程一次只持有一个或几个锁,并且任何两个或多个线程同时想要同一个锁的概率很低(随机访问模式或圆形轨道上不同位置的 8 个跑步者以大致相同的速度或其他更复杂的事情运行),那么您将主要避免最坏的情况,即线程必须休眠才能获得锁(或者在某些情况下必须让操作系统参与来决定谁获胜),因为你有线程少,锁多。

    如果每个线程在任何时候都可能需要成百上千个锁,那么事情就会开始发生变化。

    我不会涉及避免死锁,因为我对您正在使用的容器一无所知,但您需要注意避免死锁的必要性。

    【讨论】:

      猜你喜欢
      • 2013-02-11
      • 2018-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      • 2010-09-16
      相关资源
      最近更新 更多