c - 为什么 pthread 互斥锁被认为是 "slower"而不是 futex?

为什么 POSIX 互斥锁被认为比 futexes 更重或更慢? pthread 互斥锁类型的开销来自哪里?我听说 pthread 互斥体是基于 futexes 的,当没有争议时,不要对内核进行任何调用。看来 pthread 互斥锁只是 futex 的“包装器”。

是否只是函数包装调用中的开销以及互斥函数“设置” futex 的需要(即,基本上是为 pthread 互斥函数调用设置堆栈)?还是 pthread 互斥体发生了一些额外的内存屏障步骤?

最佳答案

创建Futex 是为了提高pthread 互斥体的性能。 NPTL 使用 futexes,LinuxThreads 早于 futexes,我认为这是“较慢”考虑的地方。 NPTL 互斥锁可能有一些额外的开销,但应该不会太多。

编辑: 实际开销主要包括:

  • 为互斥锁类型选择正确的算法(正常、递归、自适应、错误检查;正常、稳健、优先级继承、优先级保护),其中代码向编译器强烈暗示我们可能使用的是正常的互斥体(因此它应该将其传达给 CPU 的分支预测逻辑),
  • 如果我们设法获取互斥锁的当前所有者,这通常应该很快,因为它与我们刚刚获取的实际锁驻留在同一缓存行中,除非锁被严重争用并且其他一些 CPU 在我们获取锁和尝试写入所有者之间访问了锁(普通互斥锁不需要此写入,但错误检查和递归互斥锁需要)。

因此,从几个周期(典型情况)到几个周期 + 一个分支错误预测 + 一个额外的缓存未命中(非常糟糕的情况)。

关于c - 为什么 pthread 互斥锁被认为是 "slower"而不是 futex?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6364314/

相关文章:

linux - 如何在 AWS 上的 Amazon Linux AMI 中自动启动 node.js

ruby-on-rails - Ruby on Rails - 无法将 "\x89"从 ASCII-

linux - 在tmux中绑定(bind)Ctrl+Tab和Ctrl+Shift+Tab

ruby-on-rails - 如何在 Linux 上使用 Ruby 2.0 改进 unicorn

python - 在 Ubuntu 中启动时运行 Python 脚本

linux - 使用 linux 命令行 (bash) 从网络摄像头拍照

c++ - 如何在 Linux 中命名线程?

linux - 在 PHP CLI 中设置 max_execution_time

linux - Vagrant 的鸡和蛋 : Shared folder with uid = ap

linux - 我需要 -D_REENTRANT 和 -pthreads 吗?