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

ano*_*non 22 c++ mutex pthreads process shared-memory

我发现了这个: 快速进程间同步方法

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

那里的问题/答案似乎意味着:

如果我有两个单独的程序A和B.它们有一个共享的内存区域M.我可以将一个pThread互斥锁放在M中,锁定在A中,锁定在B中,在A中解锁; 和B将不再阻止互斥锁.它是否正确?可以在两个独立的进程中共享pThread互斥锁吗?

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

Ste*_*sop 16

你需要告诉互斥锁在进入时是进程共享的:

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

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


Voi*_*oid 6

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

编辑:正如史蒂夫指出的那样,假设平台支持该功能,您需要明确配置互斥共享进程,如上所述.


Sni*_*gus 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; 
}
Run Code Online (Sandbox Code Playgroud)

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

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

我知道这违背了互斥体的定义,但有可能:

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