【问题标题】:std::mutex in shared memory not working共享内存中的 std::mutex 不起作用
【发布时间】:2018-03-21 15:16:16
【问题描述】:

我有一个场景,共享内存区域由两个不同的进程独占访问。当我启动进程时,第一个进程成功锁定互斥锁,更新内存并解锁互斥锁。但是我观察到,当第二个进程尝试加锁时,它仍然处于死锁状态,等待互斥锁解锁。

第一个进程和第二个进程互斥锁的时间差是10s。

我正在使用 std::mutex。请告诉我我错过了什么。

【问题讨论】:

  • 请尝试创建一个Minimal, Complete, and Verifiable Example 并向我们展示。而且我不确定std::mutex 是在这里使用的正确原语,它可能使用特定于进程的数据(以帮助线程间 同步)。您应该改为使用您的平台跨进程互斥锁或信号量。
  • 请提供一个示例,说明您正在尝试做什么,以便更好地了解您的潜在错误。
  • 请向我们提供尽可能少的程序代码。我们需要看代码告诉你是否有错误
  • std::mutex 不是进程间互斥锁。您可能需要考虑使用 boost.interprocess 库。

标签: c++ multithreading mutex shared-memory stdmutex


【解决方案1】:

尽管其他人对文档进行了引用,但当在 Linux 上的共享内存中使用时,std::mutexstd::shared_mutex实际上可以跨进程工作。我检查过 GCC 8.3.1 和 Clang 6.0.1。

这些在 Linux 上的标准 C++ 实现使用 pthreads。将PTHREAD_PROCESS_SHAREDPTHREAD_PROCESS_PRIVATE 作为pthread_mutex_tpthread_rwlock_t 的属性的pthreads 提供被抽象出来并默认为 通过std::mutexstd::shared_mutex。尽管 POSIX 文档说默认值为 PRIVATE,但在共享内存中分配的 pthread_mutex_tpthread_rwlock_t 将在锁定时阻塞竞争进程。 这是因为在 Linux 上 pthread 的实际实现使用了 futexes,并且它们旨在用于共享内存,即使在映射地址可能因进程而异的情况下也是如此。

考虑到使用 futexes 实现互斥锁的策略,PTHREADS_PROCESS_PRIVATE 行为实际上可能更难以实现,因此,没有实现。

如果您确实希望您的互斥锁是进程私有的,请避免将它们放在共享内存中。另一方面,如果您确实想分享它们,请注意这种标准差异可能会发生变化。

为了可靠性,请使用Boost Interprocess

【讨论】:

    【解决方案2】:

    std::mutex 不支持进程间操作,但 pthread 库有你可以使用的进程间互斥锁。示例here

    【讨论】:

      【解决方案3】:

      一个 std::mutex 实例只作用于单个进程;它不能进行进程间同步/并发。它只能同步父进程中的子线程。

      改用 Boost 或进程间同步库。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-12
        • 1970-01-01
        • 1970-01-01
        • 2014-03-01
        • 1970-01-01
        • 2015-07-04
        • 2021-12-27
        相关资源
        最近更新 更多