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的细节不是我的专长领域之一。