Multithreading 更多的互斥锁是否更有效? 假设我在C++中使用pTrk,假设我有n(例如n=10或100)独立变量需要互斥保护。我可以创建N个互斥体,每个变量一个,或者我可以创建一个互斥体,以保护所有这些N个变量。假设他们之间没有死锁

Multithreading 更多的互斥锁是否更有效? 假设我在C++中使用pTrk,假设我有n(例如n=10或100)独立变量需要互斥保护。我可以创建N个互斥体,每个变量一个,或者我可以创建一个互斥体,以保护所有这些N个变量。假设他们之间没有死锁,multithreading,mutex,Multithreading,Mutex,当然,理想情况下,具有N个互斥体更好,因为等待的重叠更少。但在实践中,这总是真的吗?维护过多的互斥锁是否还有其他开销(除了创建/销毁)呢?这取决于使用场景 如果相对于变量的数量,线程的数量相对较多,并且/或者尝试访问同一变量时发生冲突的几率较低,那么最好使用大量的互斥体,例如每个变量一个互斥体 但是,如果有少量线程和/或存在访问变量的模式,则最好使用较少的锁(即使是单个锁),以降低锁定/解锁互斥锁的成本 对于后者,请参见当前Python和Ruby的主流实现如何为每个解释器使用一个锁: 通常情况下

当然,理想情况下,具有N个互斥体更好,因为等待的重叠更少。但在实践中,这总是真的吗?维护过多的互斥锁是否还有其他开销(除了创建/销毁)呢?

这取决于使用场景

如果相对于变量的数量,线程的数量相对较多,并且/或者尝试访问同一变量时发生冲突的几率较低,那么最好使用大量的互斥体,例如每个变量一个互斥体

但是,如果有少量线程和/或存在访问变量的模式,则最好使用较少的锁(即使是单个锁),以降低锁定/解锁互斥锁的成本

对于后者,请参见当前Python和Ruby的主流实现如何为每个解释器使用一个锁: 通常情况下,互斥锁(至少是pthreads/C++std线程)并不昂贵。应该避免的是,让两个线程在紧循环中运行,以打击相同的锁-锁争用是非常昂贵的。当然,对于某些数据,也可以使用原子替换锁

如果可能的话,试着明智地划分工作负载,以避免线程常常等待很长时间来获取锁的情况。关键部分应简短,最好避免长时间或复杂的函数调用或关键部分内任何其他难以分析的内容。

必须以艰苦的方式了解“死锁”的含义。