使用许多互斥锁

han*_*nno 10 c linux hpc pthreads

我有一个大的树结构,其中几个线程同时工作.理想情况下,我希望每个单元都有一个单独的互斥锁.

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

但是,当pthread_mutex_t仅使用8个线程时,使用许多(比如说几千个)不同的s 会有任何性能损失吗?

Whi*_*ind 10

如果您经常锁定和解锁,则可能会受到惩罚,因为获取和释放锁定确实需要一些时间,并且如果锁定是争用的话,可能需要相当长的时间.

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

如果您有大量的锁,跨内存分布,缓存问题可能会导致性能问题,具体取决于体系结构,因为锁定操作通常会使缓存的某些部分无效.

您最好的选择可能是实现一个简单的锁定结构,然后对其进行分析,然后根据需要对其进行优化以提高性能.我不确定你在树上做了什么,但如果你期望阅读的内容远远超过你的更新,那么一个好的起点可能是整个树的单个读写器锁.

"我们应该忘记小的效率,比如大约97%的时间:过早的优化是所有邪恶的根源." - 唐纳德克努特