1

我有一些代码需要使用信号量或互斥锁来锁定。代码是这样的:

callA();
callB();
callC();
.
.
.
callZ();

我想知道锁定它的有效方法。我正在考虑的选项是

  • 在 callA() 之前锁定,在 callZ() 之后解锁。我担心的是锁定会保持相当长的一段时间。

  • 每次函数调用后锁定和解锁。我担心抓取和释放锁的“开销太大”。

感谢您的帮助!

4

1 回答 1

3

这完全取决于您的用例。您可以容忍多少锁定/解锁/锁定/解锁性能损失?权衡一下,你愿意在等待锁的同时再做一个任务块多久?一些线程是延迟关键的还是交互式的,而其他线程是批量的还是低优先级的?是否有其他任务会通过其他代码路径获取相同的锁?如果是这样,那些看起来像什么?callA如果,等中的关键部分callB真的是分开的,那么你想使用 26 个不同的锁吗?还是他们操作相同的数据,迫使您使用单个锁?

顺便说一句,如果您使用的是 Linux,请务必使用(pthreads)互斥锁,而不是信号量。互斥锁的快速路径完全是用户空间。在没有争用时锁定和解锁它们非常便宜。信号量没有捷径可走。

在不知道其他任何事情的情况下,我建议使用细粒度锁定,特别是如果您的各个函数已经组织好,不会做出只有在所有函数都持有锁的情况下才会成立的假设。但正如我所说,这真的取决于你在做什么以及你为什么这样做。

于 2012-04-26T17:10:39.617 回答