我在共享内存上使用pthread_mutex_t
和PTHREAD_PROCESS_SHARED
在不同进程之间进行同步。
如果进程退出但互斥锁被锁定,则互斥锁可能会死锁。 POSIX标准中有PTHREAD_MUTEX_ROBUST
。但似乎Mac OS X不支持PTHREAD_MUTEX_ROBUST
。
在Mac OS X上是否有某种mutex
可以在共享内存上使用,并用于同步交叉进程,并且在进程无法解锁的情况下保持健壮?< / p>
答案 0 :(得分:3)
强大的东西出现在后来的POSIX线程迭代(SUSv7)中,不属于Mac OS X支持的标准(SUSv2)。
Apple文档没有显示pthread_mutexattr_setrobust
函数(或其等效的get
),并且他们声明他们基于SUSv2,因此这解释了为什么您没有它
就修复问题而言,您可能会考虑使用atexit
处理程序来释放您现有程序可能拥有的任何资源。
或者另一种可能性是在外部监视死锁并在发现问题时进行清理。例如,在以下行中有一个带有两个线程的看门狗进程。
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
由于死锁而停止,然后通过使用互斥锁关闭所有进程并销毁它来清除所有进程(通过删除共享内存)。
看门狗然后可以退出,并且可能无论您启动整个应用程序的代码是什么,都会在某个时刻启动。或者,您可以让监视程序进程在退出之前发出某种警报,以确保查看问题。
监督程序背后的想法是让它尽可能简单,希望能够证明它是正确的(或者至少比你错误的程序更多)。
毫无疑问,根据您的整体架构,还有许多其他可能性。我刚刚提供了这些少数,让你有所思考。