【问题标题】:When to use pthread_mutex_t何时使用 pthread_mutex_t
【发布时间】:2016-09-03 18:45:20
【问题描述】:

有人可以解释一下在什么情况下使用 std::mutex 与 pthread_mutex_t 是有益的。我不明白为什么我们会使用 pthread_mutex_t。谢谢

【问题讨论】:

  • @xaxxon AFAIK,您可以使用 std::mutex 并且仅将 pthread_specific 的东西用于无法通过 std::thread api 获得的东西。 std:: api 允许您获取 pthread 内容的本机线程句柄。然后,使应用程序适应例如Windows 将需要更少的工作和更少的#ifdefs。

标签: c++ pthreads mutex


【解决方案1】:

pthread_mutex_t 是一个 POSIX 解决方案(适用于 linux 和其他 UNIX 系统),在 c++11 将同步原语引入 c++ 库之前就已经存在。你现在应该使用std::mutex,除此之外它更跨平台(也可以在Windows下使用)。

【讨论】:

  • "linux-specific solution" - 它比这更古老、更广泛;作为 POSIX 的一部分,早在我记忆中(即 30 年前它就已经很老了)、VMS 和其他系统上,它就得到了 UNIX 系统的支持。
【解决方案2】:

std::mutex 只是支持 pthread 的系统上 pthread_mutex 的一个薄包装。

一般而言,std:: 线程原语上的操作与本机版本(pthreads 或 windows 线程)相比非常有限。如果您不需要这些功能,则应始终使用 std:: 版本,但如果您确实需要高级功能,则别无选择,只能使用本机版本。

native handle() 方法的存在正是出于这个原因。

【讨论】:

    【解决方案3】:

    std::mutex 来自标准库,因此如果您使用它,您的代码也将在不提供 pthread 的平台上编译。比如windows下std::mutex使用原生WinAPI mutex实现。

    最好始终使用std::mutex

    【讨论】:

    • std:: 线程的另一个优点是您可以轻松使用 RAII,因此它可以更好地与 C++ 异常混合。
    【解决方案4】:

    请参阅 pthread_mutexattr 以了解除了默认值之外可用的其他 POSIX 互斥体风格。尽管 std::recursive_mutex 提供了主要的一种——递归与非递归——但对于 BSD 优先级上限等情况则不然。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多