在Mac OS X中是否有PTHREAD_MUTEX_ROBUST等效?

时间:2014-07-25 01:58:23

标签: c++ macos mutex robust

我在共享内存上使用pthread_mutex_tPTHREAD_PROCESS_SHARED在不同进程之间进行同步。

如果进程退出但互斥锁被锁定,则互斥锁可能会死锁。 POSIX标准中有PTHREAD_MUTEX_ROBUST。但似乎Mac OS X不支持PTHREAD_MUTEX_ROBUST

在Mac OS X上是否有某种mutex可以在共享内存上使用,并用于同步交叉进程,并且在进程无法解锁的情况下保持健壮?< / p>

1 个答案:

答案 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由于死锁而停止,然后通过使用互斥锁关闭所有进程并销毁它来清除所有进程(通过删除共享内存)。

看门狗然后可以退出,并且可能无论您启动整个应用程序的代码是什么,都会在某个时刻启动。或者,您可以让监视程序进程在退出之前发出某种警报,以确保查看问题。

监督程序背后的想法是让它尽可能简单,希望能够证明它是正确的(或者至少比你错误的程序更多)。

毫无疑问,根据您的整体架构,还有许多其他可能性。我刚刚提供了这些少数,让你有所思考。