我一直在寻找试图找出Linux中c / c ++进程的最大互斥量是多少而没有成功。还有,有办法修改这个数字。我读过的这本书提到了如何找到Linux中允许的最大线程数以及如何修改这个数字,但没有提到互斥锁。
答案 0 :(得分:13)
为什么没有定义限制
考虑了最大互斥量和条件变量数的符号但被拒绝,因为这些对象的数量可能会动态变化。此外,许多实现将这些对象放入应用程序内存中;因此,没有明确的最大值。
<小时/> 编辑:在评论中,您询问
mutex
可能 内存的费用。嗯,我不知道,但我发现了一些有趣的材料:
关于How does a Mutex Work的这篇文章说明了费用:
费用
关于互斥锁的成本,有一些兴趣点。第一个也是非常重要的一点是等待时间。您的线程应该只花费一小部分时间等待互斥锁。如果他们经常等待,那么你就失去了并发性。在最坏的情况下,许多线程总是试图锁定相同的互斥锁可能导致性能比服务于所有请求的单个线程更糟糕。这实际上不是互斥体本身的成本,而是并发编程的一个严重问题。
互斥锁的开销成本与测试和设置操作以及实现互斥锁的系统调用有关。测试和设置可能是非常低的成本;对于并发处理至关重要的CPU有充分的理由使其高效。然而,我们忽略了另一条重要指令:围栏。这用于所有高级互斥锁,并且可能比测试和设置操作具有更高的成本。比系统调用更加昂贵。您不仅要承受系统调用的上下文切换开销,内核现在在其调度代码中花费一些时间。
所以我猜测他们就EAGAIN
错误谈论的费用涉及CPU
或internal kernel structures
。也许两者。也许是一些内核错误......老实说,我不知道。
我选了一些你可能感兴趣的SO Q&amp; A。好好阅读!