23

我找到了这个: 快速进程间同步方法

我曾经相信一个 pthread 互斥锁只能在同一个线程中的两个线程之间共享地址空间中的两个线程之间共享。

那里的问题/答案似乎暗示:

如果我有两个单独的进程 A 和 B。它们有一个共享内存区域 M。我可以在 M 中放置一个 pThread 互斥体,锁定 A,锁定 B,解锁 A;并且 B 将不再阻塞互斥锁。这个对吗?pThread 互斥锁可以在两个单独的进程中共享吗?

编辑:我在 MacOSX 上使用 C++。

4

3 回答 3

17

您需要在启动互斥锁时告诉它是进程共享的:

http://www.opengroup.org/onlinepubs/007908775/xsh/pthread_mutexattr_setpshared.html

特别注意,“属性的默认值是 PTHREAD_PROCESS_PRIVATE”,这意味着从不同的进程访问它是未定义的行为。

于 2010-03-05T23:35:42.893 回答
6

如果您的 C/pthread 库符合要求,您应该能够通过检查_POSIX_THREAD_PROCESS_SHARED功能测试宏是否定义为其他值-1或在运行时使用sysconf(_SC_THREAD_PROCESS_SHARED)if that查询系统配置来判断它是否支持跨多个进程共享的互斥锁功能测试宏未定义

编辑:正如史蒂夫指出的那样,假设平台支持我上面描述的该功能,您需要显式配置互斥锁以跨进程共享。

于 2010-03-05T23:31:29.547 回答
1

我担心可能存在共享内存中的互斥锁可能无法正常运行的情况,因此我进行了一些挖掘并提出了一些文档,这些文档将问题视为理所当然:

https://computing.llnl.gov/tutorials/pthreads/

然而,进一步挖掘表明,旧版本的 glibc 在共享内存互斥锁中遇到了问题:(这是一个古老的变化,但它说明了这一点。)

in linuxthreads/mutex.c
int __pthread_mutexattr_setpshared(...) {
    /* For now it is not possible to shared a conditional variable. */
    if (pshared != PTHREAD_PROCESS_PRIVATE)
    return ENOSYS; 
}

如果没有更多关于您正在使用的 pthread 实现的详细信息,很难说您是否安全。

我担心的原因是许多实现(以及一些完整的语言,如 perl、python 和 ruby​​)都有一个全局锁对象来管理对共享对象的访问。该对象不会在进程之间共享,因此,虽然您的互斥锁可能大部分时间都可以工作,但您可能会发现自己有两个进程同时在同时操作互斥锁。

我知道这与互斥锁的定义背道而驰,但有可能:

如果两个线程同时在不同的进程中运行,则意味着它们在不同的内核上。两者都获取它们的全局锁对象并去操作共享内存中的互斥锁。如果 pthread 实现通过缓存强制更新互斥锁,则两个线程可能最终同时更新,都认为他们持有互斥锁。这只是想到的一个可能的故障向量。可能有任何数量的其他人。您的具体情况是什么 - 操作系统、pthreads 版本等?

于 2010-03-05T19:44:03.170 回答