【问题标题】:Is there PTHREAD_MUTEX_ROBUST equivalent in Mac OS X?Mac OS X 中是否有 PTHREAD_MUTEX_ROBUST 等价物?
【发布时间】:2014-09-16 18:52:06
【问题描述】:

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

如果进程退出但互斥锁处于锁定状态,则互斥锁可能会死锁。 POSIX 标准中有一个PTHREAD_MUTEX_ROBUST。但是Mac OS X好像不支持PTHREAD_MUTEX_ROBUST

Mac OS X 上是否有某种mutex 可以在共享内存上使用,用于同步跨进程,以及在进程死亡但未解锁的情况下保持稳健?

【问题讨论】:

    标签: c++ macos mutex robust


    【解决方案1】:

    强大的东西出现在后来的 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 由于死锁而停止,然后通过关闭所有使用互斥锁的进程并销毁它(通过删除共享内存)来清理所有内容。

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

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

    毫无疑问,根据您的整体架构,还有许多其他可能性。我只是在脑海中提供了这些,让你思考一下。

    【讨论】:

    • 谢谢。我想知道是否有一个以OSxxxNSxxx 开头的等效函数可以完成互斥锁的任务。而对于 'atexit',我会确定 Ctrl-C 或崩溃时的情况。
    • @SswaterShi:不知道,抱歉。我熟悉 PThreads 本身和一般的线程,但 OS X 的 细节 不是我的专业领域之一。
    猜你喜欢
    • 1970-01-01
    • 2011-01-03
    • 2010-12-27
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    相关资源
    最近更新 更多