强大的东西出现在后来的 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 由于死锁而停止,然后通过关闭所有使用互斥锁的进程并销毁它(通过删除共享内存)来清理所有内容。
然后看门狗可以退出,并且大概您已经拥有的用于启动整个应用程序的任何代码都会在某个时候启动。或者,您可以让看门狗进程在退出之前发出某种警报,以确保问题得到解决。
看门狗进程背后的想法是让它尽可能简单,希望能够证明它是正确的(或者至少比你的错误程序更正确)。
毫无疑问,根据您的整体架构,还有许多其他可能性。我只是在脑海中提供了这些,让你思考一下。