【问题标题】:Why does Apache MPM prefork.c use a mutex to protect accept()?为什么 Apache MPM prefork.c 使用互斥锁来保护 accept()?
【发布时间】:2013-02-09 12:26:23
【问题描述】:

我坐下来阅读Apache's MPM prefork.c,这段代码使用了一个名为accept_mutex的变量来防止多个线程调用accept()。这很奇怪,因为据我所知accept() is thread-safe

accept() 线程安全吗?这是平台兼容性问题吗?如果是这样,哪个平台实现了非线程安全的accept()

【问题讨论】:

  • 互斥锁的存在是为了避免“雷群问题”。

标签: c multithreading apache sockets thread-safety


【解决方案1】:

这在Apache performance tuning documentation 中的“accept() 序列化 - 多个套接字”下进行了解释。简而言之,至少在某些操作系统下,传入连接将唤醒所有select()poll() 中等待传入连接的 Apache 进程,但会导致 accept() 失败除了其中一个。这是低效的,因此使用互斥锁来确保一次只有一个进程接受传入连接。

【讨论】:

    【解决方案2】:

    阅读您链接到的源中的 cmets。似乎互斥锁并没有真正保护accept 操作,而是需要轮询的侦听套接字列表(请注意,当只有一个侦听套接字时不使用互斥锁,至少在未损坏的系统上accept 工作正常)。如果这可以在运行时改变,那么代码可能是正确的。但我有一种感觉,他们只是在做一些荒谬的事情。这是 Apache,所以你不应该期望高质量甚至合理的代码......

    【讨论】:

      猜你喜欢
      • 2022-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      • 2011-01-29
      • 2010-11-18
      • 2014-02-28
      相关资源
      最近更新 更多