首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如果在共享内存中,pthread互斥锁能跨线程工作吗?

如果在共享内存中,pthread互斥锁能跨线程工作吗?
EN

Stack Overflow用户
提问于 2010-03-06 03:23:45
回答 2查看 23.2K关注 0票数 23

我发现了这个:Fast interprocess synchronization method

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

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2010-03-06 07:35:43

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

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

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

票数 17
EN

Stack Overflow用户

发布于 2010-03-06 03:44:03

我担心可能会出现共享内存中的互斥可能无法正常运行的情况,所以我做了一些挖掘,并提出了一些文档,这些文档将这个问题视为轻而易举的事情:

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

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

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2389353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档