首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mac中是否有等效的PTHREAD_MUTEX_ROBUST?

Mac中是否有等效的PTHREAD_MUTEX_ROBUST?
EN

Stack Overflow用户
提问于 2014-07-25 01:58:22
回答 1查看 1.4K关注 0票数 3

我在共享内存上使用pthread_mutex_tPTHREAD_PROCESS_SHARED来实现不同进程之间的同步。

如果进程退出,但互斥锁被锁定,则互斥锁可能会陷入僵局。POSIX标准中有一个PTHREAD_MUTEX_ROBUST。但是Mac似乎不支持PTHREAD_MUTEX_ROBUST

在Mac上是否有某种mutex可以用于共享内存,用于同步跨进程,以及在进程没有解锁的情况下具有鲁棒性?

EN

回答 1

Stack Overflow用户

发布于 2014-07-25 02:27:17

健壮的内容出现在后来的POSIX线程(SUSv7)迭代中,而不是Mac (也就是SUSv2)所支持的标准的一部分。

Apple没有显示pthread_mutexattr_setrobust函数(或其相应的get),并且声明它们是基于SUSv2的,所以这就解释了为什么您没有它。

在解决问题方面,您可以考虑使用atexit处理程序来释放现有程序可能拥有的任何资源。

或者另一种可能是从外部监视死锁,并在发现问题时清除。例如,有一个具有两个线程的看门狗进程,如下所示。

代码语言:javascript
运行
复制
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由于死锁而停止,然后通过使用互斥锁关闭所有进程并销毁它(通过删除共享内存)来清除一切。

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

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

毫无疑问,还有许多其他的可能性取决于您的总体架构。我只是从头上拿出了这几个让你思考的东西。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24946886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档