我在共享内存上使用pthread_mutex_t和PTHREAD_PROCESS_SHARED来实现不同进程之间的同步。
如果进程退出,但互斥锁被锁定,则互斥锁可能会陷入僵局。POSIX标准中有一个PTHREAD_MUTEX_ROBUST。但是Mac似乎不支持PTHREAD_MUTEX_ROBUST。
在Mac上是否有某种mutex可以用于共享内存,用于同步跨进程,以及在进程没有解锁的情况下具有鲁棒性?
发布于 2014-07-25 02:27:17
健壮的内容出现在后来的POSIX线程(SUSv7)迭代中,而不是Mac (也就是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看门狗每5秒有效地锁定和解锁互斥锁,每次增加一个变量。如果由于某种原因导致死锁,thread2将停止,并且变量将永远不会被更新。
同时,thread1正在检查以确保thread2仍在运行,方法是每分钟对照其本地副本检查变量。如果发现它们是相同的,则假设thread2由于死锁而停止,然后通过使用互斥锁关闭所有进程并销毁它(通过删除共享内存)来清除一切。
然后,看门狗可以退出,并且想必您已经拥有的任何启动整个应用程序的代码都会在某个时候启动。或者,您可以让看门狗进程在退出之前发出某种警告,以确保问题得到解决。
看门狗过程背后的想法是使它尽可能简单,希望到可以证明它是正确的(或者至少比您错误的程序更正确)。
毫无疑问,还有许多其他的可能性取决于您的总体架构。我只是从头上拿出了这几个让你思考的东西。
https://stackoverflow.com/questions/24946886
复制相似问题