如果我没弄错的话,Linux pthread C API 中是否可以使用健壮的互斥体,它可以跨进程共享(通过将它们放置在共享内存中),并且允许您在进程之前获取锁拿着它已经崩溃了。但是,我想知道在为进程分配 PID 时这是否会导致问题。
例如,假设我正在创建两个进程,并与互斥锁同步:
+-----------+ +-----------+
| Process 1 | +-----------+ | Process 2 |
| PID 1000 | | Mutex | | PID 1001 |
+-----------+ +-----------+ +-----------+
| | |
| lock | |
+------------>| |
| unlock | |
|------------>| lock |
| |<-------------|
| | released |
| |<- - - - - - -X
| | +-----------+
| | | Process 3 |
| | | PID 1001 |
| | +-----------+
| | lock |
| |<---------------------------|
| | ^ |
| | | |
| | HERE |
然后,进程 2 崩溃,因此互斥锁应该被释放,但随后会产生一个新的进程 3,并且为它分配与进程 2 相同的 PID(鉴于 Linux 政策,这极不可能,但我猜技术上可能吗?)。在这种情况下,互斥体是否正确释放?如果进程 3 再次尝试锁定它,会发生什么?如果是进程1试图加锁呢?
您下次尝试锁定互斥体时,无论哪个进程或线程尝试锁定互斥体,都会成功并显示
EOWNERDEAD
(之后该线程应调用pthread_mutex_consistent
)。
处理这个问题的机制并不完全依赖于 PID/TID,而是让内核在进程/线程退出、
FUTEX_OWNER_DIED
或死亡时标记底层 futex(通过将其设置为 exec
)内核确实检查所有权),C 库稍后会处理。
如果您想了解更多详细信息,我建议您查看这个答案