更多的互斥体更有效吗?

时间:2017-03-10 23:39:19

标签: multithreading mutex

假设我在C ++中使用pthread,假设我有N(例如,N = 10或100)个独立变量需要互斥保护。我可以创建N个互斥锁,每个变量一个,或者我可以创建一个互斥锁,以保护所有这些N个变量。假设它们之间没有死锁。

当然,理想情况下,N个互斥体更好,因为等待时间较少重叠。但在实践中,这总是如此吗?还有其他开销(除了创建/销毁)来维护太多的互斥量吗?

2 个答案:

答案 0 :(得分:0)

这取决于使用场景。

如果相对于变量数量有相对大量的线程和/或尝试访问同一变量的冲突率很低,那么最好使用大量的互斥锁,例如:每个变量一个。

但是,如果您有少量线程和/或存在访问变量的模式,那么最好使用较少的锁(甚至是单个锁)来降低锁定/解锁互斥锁的成本。 / p>

对于后者,看看目前Python和Ruby的主流实现如何使用每个解释器的单个锁: https://en.wikipedia.org/wiki/Global_interpreter_lock https://softwareengineering.stackexchange.com/questions/186889/why-was-python-written-with-the-gil

答案 1 :(得分:0)

一般的互斥体(至少是pthreads / C ++ std线程)并不昂贵。应该避免的是让两个线程在紧密的循环中运行并敲击相同的锁 - 锁争用是昂贵的。当然,对于某些数据,您也可以用原子替换锁。

如果可能,请尝试明智地对工作负载进行分区,以避免线程经常等待很长时间获取锁定的情况。关键部分应该简短,并且优先考虑避免长时间或复杂的函数调用或关键部分内任何其他难以分析的内容。