pthread_mutex_lock 和一个废弃的共享互斥锁

问题描述 投票:0回答:0

如果我问的是显而易见的,请原谅我。我来自多年的 Windows 下编程。

目前我正在做一个在 macOS 下运行的项目。 (而且我相信它在底层使用 Free BSD。)

所以我需要从多个进程同步访问共享资源(一个是启动守护进程,其他是客户端进程。)

我选择使用共享(命名)互斥体来这样做。

我看不到内核对命名互斥锁的任何直接实现。我所能找到的都是使用共享内存的实现,它是这样的:

  1. Create/open a shared memory segment, either with
    shm_open
    or with
    shmget
    +
    shmat
  2. 使用常规的
    pthread_mutex_t
    ,但使用属性对其进行初始化:
    pthread_mutexattr_setpshared(&mtxAtt, PTHREAD_PROCESS_SHARED);
  3. 然后将其创建为常规互斥体:
    pthread_mutex_init
  4. 并用它用
    pthread_mutex_lock
    pthread_mutex_unlock
    锁定和解锁。

这有效,除了一个边缘情况:

说,客户端通过调用

pthread_mutex_lock
获取这个共享互斥体,然后要么崩溃,要么被用户终止,因此它永远不会调用
pthread_mutex_unlock
。 (在微软的说法中,他们称该互斥量将处于的状态为 “已放弃”互斥量。在他们的情况下,如果另一个进程试图获取此类互斥量,这将导致锁定函数出错以表示情况。)

在我的例子中,对于 macOS,如果我的启动守护进程试图在同一个共享互斥锁上调用

pthread_mutex_lock
(在它被“放弃”之后),它将永远死锁。

因此,我想知道,是否有办法确定互斥体是否处于这种“废弃”状态? (并避免锁定此类互斥锁并可能导致线程死锁的死锁。)

c macos freebsd bsd launch-daemon
© www.soinside.com 2019 - 2024. All rights reserved.