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

Ssw*_*Shi 5 c++ macos mutex robust

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

如果进程退出但互斥锁保持锁定状态,则互斥锁可能会死锁。有一个PTHREAD_MUTEX_ROBUSTPOSIX 标准。但 Mac OS X 似乎不支持PTHREAD_MUTEX_ROBUST.

Mac OS X 上是否有某种mutex可以在共享内存上使用的东西,可以用于同步跨进程,并且在进程在没有解锁的情况下死亡的情况下具有鲁棒性?

pax*_*blo 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
Run Code Online (Sandbox Code Playgroud)

看门狗每五秒有效地锁定和解锁互斥锁,每次都会增加一个变量。如果由于某种原因出现死锁,thread2则会停止并且变量将永远不会更新。

与此同时,thread1正在检查以确保thread2仍在运行,每分钟检查变量与其本地副本。如果发现它们相同,则假定thread2由于死锁而停止,然后通过关闭使用互斥体的所有进程并销毁它(通过删除共享内存)来清理所有内容。

然后看门狗可以退出,并且可能您已经拥有的用于启动整个应用程序的任何代码都将在某个时刻启动。或者您可以让看门狗进程在退出之前发出某种警报,以确保问题得到解决。

看门狗进程背后的想法是使其尽可能简单,希望能够证明它是正确的(或者至少比错误的程序更正确)。

毫无疑问,根据您的整体架构,还有许多其他可能性。我只是随心所欲地提供了这些内容,供您思考。