如果在共享内存中,pthread互斥锁是否跨线程工作?

25
我发现这个网页:Fast interprocess synchronization method

我曾经认为 pthread 互斥锁只能在同一 地址空间 的两个线程之间共享。
那里的问题/答案似乎暗示:
如果我有两个独立的进程 A 和 B。它们有一个共享的内存区域 M。我可以把 pthread 锁放在 M 中,在 A 中加锁,在 B 中加锁,在 A 中解锁;然后 B 将不再被锁。这是正确的吗?pthread 互斥锁可以在两个独立的进程中共享吗?
编辑:我正在使用 C++,在 MacOSX 上。

OP的相关问题:http://stackoverflow.com/questions/2389307/on-macosx-in-c-how-to-do-interprocess-communication-over-shared-memory-withou - Void
3个回答

18

当前版本链接:http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_setpshared.html - alk

6
如果您的C/pthread库符合标准,您应该能够通过检查_POSIX_THREAD_PROCESS_SHARED功能测试宏是否定义为除-1以外的值或者在运行时使用sysconf(_SC_THREAD_PROCESS_SHARED)查询系统配置来确定它是否支持多进程共享互斥量。如果该功能测试宏未定义,则需要像我上面描述的那样显式地将互斥量配置为跨进程共享。编辑:正如Steve指出的,假设平台支持该特性,您需要显式地配置互斥量以实现跨进程共享。

1
请注意,操作系统实现有时可能会将 _POSIX_THREAD_PROCESS_SHARED 定义为正数,但实际上并未实现它(因为 POSIX 规范中指出它是可选的)。请参见 https://github.com/boostorg/interprocess/blob/4f8459e868617f88ff105633a9aa82221d5e9bb1/include/boost/interprocess/detail/workaround.hpp#L45 了解 boost 如何处理此问题。 - Anon

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实现强制通过缓存更新互斥锁,则两个线程可能同时更新,都认为自己持有互斥锁。这只是我想到的一个可能的故障向量。还可能有其他任何数量的故障向量。你的具体情况是什么 - 操作系统、pthread版本等?


1
你的链接是标准的pThread文档。它如何使问题变得非常简单明了? - anon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接