如果Linux内核重新分配PID,在使用C pthread互斥体时会导致错误/UB吗?

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

如果我没弄错的话,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试图加锁呢?

linux pthreads mutex scheduler pid
1个回答
0
投票

您下次尝试锁定互斥体时,无论哪个进程或线程尝试锁定互斥体,都会成功并显示

EOWNERDEAD
(之后该线程应调用
pthread_mutex_consistent
)。

处理这个问题的机制并不完全依赖于 PID/TID,而是让内核在进程/线程退出、

FUTEX_OWNER_DIED
或死亡时标记底层 futex(通过将其设置为
exec
)内核确实检查所有权),C 库稍后会处理。

如果您想了解更多详细信息,我建议您查看这个答案

© www.soinside.com 2019 - 2024. All rights reserved.