Linux中允许的c/c++互斥锁最大数量是多少?

10
我一直在搜索并尝试找到Linux系统中C/C++进程的互斥锁最大数量,但没有成功。另外,是否有一种方法可以修改这个数字。我正在阅读的书提到了如何查找Linux中允许的线程的最大数量以及如何修改此数字,但没有提到互斥锁。

3
您认为为什么必须有一个限制?您真的考虑编写一个可能会接近任何实际存在的限制的程序吗? - John Bollinger
昨天我问了一个问题,有人提到有一个限制。这是链接http://stackoverflow.com/questions/32510227/synchronizing-access-to-allocated-memory的最后一个答案。 - WhatIf
1个回答

15

查看此pthread_mutex_init

为什么没有定义限制

考虑到互斥锁和条件变量的最大数量可能会动态改变,因此拒绝了为互斥锁和条件变量的最大数量定义符号的想法。此外,许多实现将这些对象放入应用程序内存中;因此,不存在显式的最大值。


编辑:在评论中,您询问了除内存之外 mutex 可能具有的费用。我不知道,但我找到了一些有趣的材料:

这篇关于互斥锁如何工作的文章对成本表示:

成本

当涉及到互斥锁的成本时,有几个要点需要注意。首先,非常重要的是等待时间。线程应该只花费少部分时间等待互斥锁。如果它们等待过于频繁,则会失去并发性。在最坏的情况下,许多线程始终尝试锁定相同的互斥锁可能导致性能比单个线程服务所有请求还要差。这实际上不是互斥锁本身的成本,而是并发编程的一个严重问题。

互斥锁的开销与测试和设置操作以及实现互斥锁的系统调用有关。测试和设置很可能是非常低的成本;作为并发处理的必需部分,CPU 有充分的理由使其高效。我们忽略了另一条重要指令:栅栏。这在所有高级互斥锁中使用,其成本可能比测试和设置操作更高。然而,比这更昂贵的是系统调用。您不仅会遭受系统调用的上下文切换开销,内核现在还会花费一些时间在其调度代码中。

所以我猜测他们在讨论 EAGAIN 错误成本时涉及到 CPU内部内核结构。也许两者都有,也许是一些内核错误...老实说我不知道。


StackOverflow 资源

我挑选了一些可能会对您感兴趣的 SO 问答。好好阅读吧!


从同一页“EAGAIN 系统缺乏必要的资源(内存以外的其他资源)来初始化另一个互斥锁。” 他们指的是除了内存以外的哪些必要资源? - WhatIf
@user1886067,这是开放式的。就我个人而言,我认为这是一项CYA规定,旨在避免过度限制系统。请注意,选择EAGAIN作为错误代码表明资源限制预计是暂时的,而不是长期的。 - John Bollinger
@user1886067 请查看这个答案。并阅读这篇关于mutexes如何工作的文章。也许它们会对你有所帮助。 - Enzo Ferber
@user1886067 在我的回答中添加了一些参考资料。希望能有所帮助。 - Enzo Ferber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接