2012-04-26 111 views
0

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

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

我想知道有效的方式将其锁定。我正在考虑的选项是

  • 在callA()之前锁定并在callZ()之后解锁。我担心的是锁定时间很长。

  • 每次函数调用后锁定和解锁。我担心抓住和释放锁的'过多的开销'。

Appreciare您的帮助!

回答

3

这一切都取决于您的使用情况。您可以容忍多少锁定/解锁/锁定/解锁性能损失?衡量这一点,你愿意在等待锁定的时候再做一个任务吗?一些线程是否具有延迟关键性或交互性,以及其他线程是批量还是低优先级?是否还有其他任务会通过其他代码路径采用相同的锁?如果是这样,那些是什么样的?如果callAcallB等中的关键部分真的是分开的,那么您是否想使用26个不同的锁?还是他们操纵相同的数据,迫使你使用一个单一的锁?

顺便说一句,如果你使用的是Linux,肯定使用(并行线程)互斥,不信号灯。互斥体的快速路径完全是用户可用的。在没有争用的情况下锁定和解锁它们非常便宜。信号量没有快速路径。

不知道别的,我会建议细粒度锁,特别是如果你的个人功能已经组织不作出假设,如果锁在它们之间都认为只会是真实的。但正如我所说,这实际上取决于你在做什么,为什么你这样做。

+0

谢谢。我的意图是阻止其中一个线程删除这些调用A,B,C等使用的一些对象... – Manoj 2012-05-01 15:52:05