如果我问的是显而易见的,请原谅我。我来自多年的 Windows 下编程。
目前我正在做一个在 macOS 下运行的项目。 (而且我相信它在底层使用 Free BSD。)
所以我需要从多个进程同步访问共享资源(一个是启动守护进程,其他是客户端进程。)
我选择使用共享(命名)互斥体来这样做。
我看不到内核对命名互斥锁的任何直接实现。我所能找到的都是使用共享内存的实现,它是这样的:
shm_open
or with shmget
+shmat
pthread_mutex_t
,但使用属性对其进行初始化:pthread_mutexattr_setpshared(&mtxAtt, PTHREAD_PROCESS_SHARED);
pthread_mutex_init
pthread_mutex_lock
和pthread_mutex_unlock
锁定和解锁。这有效,除了一个边缘情况:
说,客户端通过调用
pthread_mutex_lock
获取这个共享互斥体,然后要么崩溃,要么被用户终止,因此它永远不会调用pthread_mutex_unlock
。 (在微软的说法中,他们称该互斥量将处于的状态为 “已放弃”互斥量。在他们的情况下,如果另一个进程试图获取此类互斥量,这将导致锁定函数出错以表示情况。)
在我的例子中,对于 macOS,如果我的启动守护进程试图在同一个共享互斥锁上调用
pthread_mutex_lock
(在它被“放弃”之后),它将永远死锁。
因此,我想知道,是否有办法确定互斥体是否处于这种“废弃”状态? (并避免锁定此类互斥锁并可能导致线程死锁的死锁。)