2010-05-05 130 views
8

我有一个大的树结构,其中几个线程同时工作。理想情况下,我希望为每个单元格创建一个单独的互斥锁。使用许多互斥锁

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

然而,没有任何性能损失使用许多时(比方说,一个几千)不同pthread_mutex_t本只是8个线程?

+0

上一棵树几千是..那种怀疑..但硬而不实际看到它说。你能发布足够的代码来展示你在做什么的合理全面的例子吗? – 2010-05-05 15:38:15

回答

8

如果您锁定和非常频繁解锁,可以有一个点球,因为获取和释放锁确实需要一定的时间,如果锁争用的过程可能会相当多。

当使用这样的结构,许多锁,你必须是非常具体的关于每个实际上锁定锁,并确保你小心AB-BA死锁。例如,如果在锁定操作期间更改树的结构,则需要以一致的顺序锁定将要更改的所有节点,并确保处理后代的线程不会感到困惑。

如果你有大量的锁,横跨内存散开,缓存问题可能会导致性能问题,根据不同的体系结构,锁定操作通常会失效,至少一些缓存的一部分。

您最好的选择可能是实现一个简单的锁定结构,然后点击个人资料,然后提炼它来提高性能,如果需要的话。我不确定你在树上做了什么,但是如果你期望阅读比你更新更多的东西,那么开始的好地方可能是整个树的单个读写器锁。

“我们应该忘记小效率,大约97%的时间:过早优化是万恶之源。” - Donald Knuth

+1

+1 - 很好的答案。 – 2010-05-05 15:36:11

0

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

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

我不会接触死锁,因为我对您使用的容器一无所知,但您需要注意避免它们的必要性。