我在共享内存上使用pthread_mutex_t
withPTHREAD_PROCESS_SHARED
在不同进程之间进行同步。
如果进程退出但互斥锁处于锁定状态,则互斥锁可能会死锁。POSIX 标准中有一个PTHREAD_MUTEX_ROBUST
。但似乎 Mac OS X 不支持PTHREAD_MUTEX_ROBUST
.
Mac OS X 上是否有某种mutex
可以在共享内存上使用的东西,用于同步跨进程,并在进程死亡而没有解锁的情况下保持稳健?
强大的东西出现在后来的 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
由于死锁而停止,然后通过使用互斥锁关闭所有进程并销毁它(通过删除共享内存)来清理所有内容。
然后看门狗可以退出,并且大概您已经拥有的用于启动整个应用程序的任何代码都会在某个时候启动。或者,您可以让看门狗进程在退出之前发出某种警报,以确保问题得到解决。
看门狗过程背后的想法是使其尽可能简单,希望能够证明它是正确的(或者至少比你的错误程序更正确)。
毫无疑问,根据您的整体架构,还有许多其他可能性。我只是在脑海中提供了这几个,让你思考一下。