c++ - pthread互斥体的开销?

我正在尝试使 C++ API(用于 Linux 和 Solaris)线程安全,以便可以从不同的线程调用它的函数而不会破坏内部数据结构。在我目前的方法中,我使用 pthread 互斥锁来保护对成员变量的所有访问。这意味着一个简单的 getter 函数现在可以锁定和解锁互斥体,我担心这样做的开销,特别是因为该 API 将主要用于单线程应用程序,其中任何互斥体锁定似乎都是纯粹的开销。

所以,我想问一下:

  • 您对使用锁定与不使用锁定的单线程应用的性能有何经验?
  • 与例如这些调用相比,这些锁定/解锁调用的成本有多大。对 bool 成员变量进行简单的“返回 this->isActive”访问?
  • 您知道保护此类变量访问的更好方法吗?

最佳答案

所有现代线程实现都可以完全在用户空间中处理非竞争互斥锁(只需几条机器指令)——只有当存在争用时,库才必须调用内核。

要考虑的另一点是,如果应用程序没有显式链接到 pthread 库(因为它是单线程应用程序),它只会获得虚拟 pthread 函数(根本不做任何锁定) -只有当应用程序是多线程的(并链接到 pthread 库)时,才会使用完整的 pthread 函数。

最后,正如其他人已经指出的那样,使用互斥锁保护诸如 isActive 之类的 getter 方法是没有意义的——一旦调用者有机会查看返回值,该值可能已经被更改(因为互斥锁只锁定在 getter 方法中)。

https://stackoverflow.com/questions/1277627/

相关文章:

linux - 用户脚本位置 linux (debian etch)

linux - 使用包管理器时如何管理 Perl 模块?

linux - 禁用内存地址的随机化

linux - 如何将文件夹中的文件列表发送到Linux中的txt文件

linux - 如何更改某些文件模式/扩展名的权限?

linux - 安装 gitLab 缺少现代化工具?

ruby - Gemfile.lock 写入错误,权限?

linux - 如何将文件从远程服务器复制到本地计算机?

windows - 帮助我让我的 windows cmd.exe 控制台更像一个 Linux 终端

linux - 如何使用 AWK 合并两个文件?