C++ Mac OS X中是否有PTHREAD_MUTEX_健壮的等价物?

C++ Mac OS X中是否有PTHREAD_MUTEX_健壮的等价物?,c++,macos,mutex,robust,C++,Macos,Mutex,Robust,我在共享内存上使用pthread\u mutex\u t和pthread\u PROCESS\u SHARED在不同进程之间进行同步 如果进程退出但保持互斥锁锁定,互斥锁可能会死锁。POSIX标准中有一个PTHREAD\u MUTEX\u ROBUST。但Mac OS X似乎不支持PTHREAD\u MUTEX\u ROBUST Mac OS X上是否有某种mutex,可以在共享内存上使用,用于同步跨进程,并在进程死亡而未解锁时保持健壮?健壮的东西出现在POSIX线程(SUSv7)的后续迭代中,

我在共享内存上使用
pthread\u mutex\u t
pthread\u PROCESS\u SHARED
在不同进程之间进行同步

如果进程退出但保持互斥锁锁定,互斥锁可能会死锁。POSIX标准中有一个
PTHREAD\u MUTEX\u ROBUST
。但Mac OS X似乎不支持
PTHREAD\u MUTEX\u ROBUST


Mac OS X上是否有某种
mutex
,可以在共享内存上使用,用于同步跨进程,并在进程死亡而未解锁时保持健壮?

健壮的东西出现在POSIX线程(SUSv7)的后续迭代中,而不是Mac OS X(即SUSv2)支持的标准的一部分

Apple文档没有显示
pthread\u mutexattr\u setrobust
函数(或其等效的
get
),它们声明它们基于SUSv2,因此这就解释了为什么没有它

在修复这个问题方面,你可以考虑使用<代码> ATEX/<代码>处理程序来释放你所退出的程序所能拥有的任何资源。 或者,另一种可能是从外部监视死锁,并在发现问题时进行清理。例如,有一个看门狗进程,它有两个线程,沿着下面的行

thread1:
    set variables gloabalNum and localNum to zero
    start thread2
    while true:
        sleep 60 seconds
        if globalNum == localNum:
            exit while
        end if
        localNum = globalNum
    end while

    kill all processes using mutex
    remove shared memory
    exit process

thread2:
    while true:
        lock mutex
        unlock mutex
        increment globalNum
        sleep 5 second
看门狗每五秒钟有效地锁定和解锁互斥锁,每次递增一个变量。如果由于某种原因出现死锁,
thread2
将停止,变量将永远不会更新

同时,
thread1
正在检查以确保
thread2
仍在运行,方法是每分钟对照变量的本地副本检查一次。如果发现它们相同,则假定
thread2
由于死锁而停止,然后通过关闭所有使用互斥锁的进程并销毁它(通过删除共享内存)来清除所有内容

看门狗随后可以退出,并且您已经拥有的启动整个应用程序的代码可能会在某个时候启动。或者,您可以让看门狗进程在退出之前发出某种警报,以确保问题得到解决

看门狗过程背后的想法是使其尽可能简单,希望达到可以证明其正确的程度(或者至少比您的错误程序更正确)


毫无疑问,根据您的总体架构,还有许多其他的可能性。我刚刚提供了这几本书,想让你想一想。

谢谢。我想知道是否有以
OSxxx
NSxxx
开头的等效函数可以执行互斥任务。对于“atexit”,我将确定Ctrl-C或崩溃时的情况。@SswaterShi:我不知道,抱歉。我熟悉PThreads本身和线程,但OSX的细节不是我的专长领域之一。