【问题标题】:c/c++ maximum number of mutexes allowed in Linuxc/c++ Linux 中允许的最大互斥量
【发布时间】:2023-04-02 05:10:01
【问题描述】:

我一直在搜索,试图找出 Linux 中 c/c++ 进程的最大互斥数是多少,但没有成功。另外,有没有办法修改这个数字。我正在阅读的书提到了如何找到 Linux 中允许的最大线程数以及如何修改这个数字,但没有提到互斥锁。

【问题讨论】:

  • 为什么你认为必须有一个限制?您是否真的在考虑编写一个可能会接近任何实际限制的程序?
  • 我昨天问了一个问题,有人提到有限制。这是链接stackoverflow.com/questions/32510227/…最后一个答案

标签: c++ c multithreading locking mutex


【解决方案1】:

检查这个pthread_mutex_init

为什么没有定义限制

考虑为互斥锁和条件变量的最大数量定义符号,但被拒绝,因为这些对象的数量可能会动态变化。此外,许多实现将这些对象放入应用程序内存中。因此,没有明确的最大值。


编辑:在您询问mutex 可能具有内存之外的成本的 cmets 中。嗯,我不知道,但我发现了一些有趣的材料:

How does a Mutex Work 上的这篇文章谈到了成本:

成本

当谈到互斥体的成本时,有几点值得关注。第一个也是非常重要的一点是等待时间。您的线程应该只花一小部分时间等待互斥体。如果他们等待太频繁,那么您将失去并发性。在最坏的情况下,许多线程总是试图锁定同一个互斥体,这可能导致性能比单个线程服务所有请求更差。这确实不是互斥锁本身的成本,而是并发编程的严重问题。

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

所以我猜测他们谈论的EAGAIN 错误的成本涉及CPUinternal kernel structures。也许两者兼而有之。也许是一些内核错误...我真的不知道。


StackOverflow 资源

我挑选了一些您可能感兴趣的 SO Q&A。好好读书!

【讨论】:

  • 来自同一页面“EAGAIN系统缺乏必要的资源(内存除外)来初始化另一个互斥体。”除了内存之外,他们指的是什么必要的资源?
  • @user1886067,它是开放式的。就个人而言,我将其视为 CYA 条款,以避免过度约束系统。请注意,错误代码选择 EAGAIN 表明资源限制是暂时的,而不是长期的。
  • @user1886067 见this answer。阅读article 了解mutexes 的工作原理。也许他们会帮助你。
  • @user1886067 在我的回答中添加了一些参考资料。希望对您有所帮助。
猜你喜欢
  • 2022-01-14
  • 2019-10-02
  • 2015-12-29
  • 2023-02-06
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多