Locking 信号量/互斥锁/解锁频率

Locking 信号量/互斥锁/解锁频率,locking,mutex,semaphore,critical-section,unlock,Locking,Mutex,Semaphore,Critical Section,Unlock,我有一些代码需要使用信号量或互斥锁来锁定。 代码如下所示: callA(); callB(); callC(); . . . callZ(); 我想知道锁它的有效方法。我想的选择是 在callA()之前锁定,在callZ()之后解锁。我担心的是锁会在相当长的一段时间内保持不变 每次函数调用后锁定和解锁。我担心抓取和释放锁的“开销太大” 感谢你的帮助 这一切都取决于您的用例。您能容忍多少锁定/解锁/锁定/解锁性能惩罚?考虑到这一点,在等待锁定的同时,您愿意创建另一个任务块多长时间?某些线程延

我有一些代码需要使用信号量或互斥锁来锁定。 代码如下所示:

callA();
callB();
callC();
.
.
.
callZ();
我想知道锁它的有效方法。我想的选择是

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

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


感谢你的帮助

这一切都取决于您的用例。您能容忍多少锁定/解锁/锁定/解锁性能惩罚?考虑到这一点,在等待锁定的同时,您愿意创建另一个任务块多长时间?某些线程延迟是关键的还是交互式的,而其他线程是批量的还是低优先级的?是否有其他任务将通过其他代码路径使用相同的锁?如果是的话,这些看起来像什么?如果
callA
callB
等中的关键部分。。真的是分开的,那么你想使用26个不同的锁吗?或者他们操纵相同的数据,迫使您使用单个锁

顺便说一下,如果您使用的是Linux,那么一定要使用(pthreads)互斥体,而不是信号量。互斥体的快速路径完全是UserSpace。在没有争用的情况下锁定和解锁它们是非常便宜的。信号量没有快速路径


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

谢谢。我的意图是阻止其中一个线程删除这些调用A、B、C等使用的一些对象。。。