我有一个大型树结构,其中有几个线程同时工作。理想情况下,我希望每个单元都有一个单独的互斥锁。
我在pthread_mutex_t
中查看了bits/pthreadtypes.h
的定义并且它相当短,因此在我的情况下,内存使用不应成为问题。
但是,对于8个线程使用多个(假设几千个)不同的pthread_mutex_t
s时,是否存在任何性能损失?
答案 0 :(得分:9)
如果你经常锁定和解锁,可能会受到惩罚,因为获取和释放锁确实需要一些时间,并且如果锁是争用的话,可能需要相当长的时间。
在这样的结构中使用许多锁时,您必须非常具体地了解每个锁实际锁定的内容,并确保您注意AB-BA死锁。例如,如果要在锁定操作期间更改树的结构,则需要以一致的顺序锁定将要更改的所有节点,并确保处理后代的线程不会混淆。
如果你有大量的锁,分布在内存中,缓存问题可能会导致性能问题,具体取决于体系结构,因为锁定操作通常会使缓存的某些部分无效。
您最好的选择可能是实现一个简单的锁定结构,然后对其进行分析,然后根据需要对其进行优化以提高性能。我不确定你在使用树做了什么,但如果你希望阅读的内容比你更新的更多,那么一个好的起点可能是整个树的单个读写器锁。
“我们应该忘记效率低下,大约97%的时间说:过早的优化是所有邪恶的根源。” - 唐纳德克努特
答案 1 :(得分:0)
您需要说明您的锁定/访问模式,以便对此进行正确评估。如果每个线程一次只能容纳一个或几个锁,并且任何两个或多个线程同时想要同一个锁的概率很低(随机访问模式或圆形轨道上不同位置的8个运行程序)以大致相同的速度或其他更复杂的东西运行)然后你将主要避免线程必须睡觉才能获得锁定的最坏情况(或者在某些情况下必须让操作系统参与决定谁获胜)因为你有几个线程和很多锁。
如果每个线程在任何时候都可能需要数百或数千个锁,那么事情就会开始发生变化。
我不会触及避免死锁,因为我对你正在使用的容器一无所知,但你需要知道需要避免它们。