我发现了这个:Fast interprocess synchronization method
我过去认为pthread互斥锁只能在同一地址空间中的两个线程之间共享。
这里的问题/答案似乎暗示:
如果我有两个独立进程A和B,它们有一个共享的内存区M。我可以把一个pThread互斥锁放在M中,锁在A中,锁在B中,解锁在A中;B将不再阻塞互斥锁。这是正确的吗?pThread互斥锁可以在两个独立的进程中共享吗?
编辑:我在MacOSX上使用C++。
发布于 2010-03-06 07:35:43
你需要告诉互斥锁在初始化时是进程共享的:
http://www.opengroup.org/onlinepubs/007908775/xsh/pthread_mutexattr_setpshared.html
特别要注意,“该属性的默认值是PTHREAD_PROCESS_PRIVATE",这意味着从不同的进程访问它是未定义的行为。
发布于 2010-03-06 03:44:03
我担心可能会出现共享内存中的互斥可能无法正常运行的情况,所以我做了一些挖掘,并提出了一些文档,这些文档将这个问题视为轻而易举的事情:
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版本等?
https://stackoverflow.com/questions/2389353
复制相似问题