Linux - 共享互斥锁和条件变量的生命周期是多少

Linux -what is lifetime of a shared mutex and cond variable

我在共享内存上创建了一个共享互斥锁和条件变量,用于两个进程(生产者和消费者)之间的通信,如果我关闭两个应用程序,然后再次 运行,我可以锁定、解锁互斥锁和条件信号变量而无需再次在共享内存上重新创建它们,mutex 和 cond 变量无需重新创建它们就可以正常工作,这怎么可能?使共享互斥锁和 cond 变量,使它们在重新启动机器之前一直有效?注意:如果我按 ctrl + c 并中断消费者并再次重新启动,则两个应用程序都已锁定,我需要删除 /dev/shm/ipcfile .

一个互斥量是被锁定还是被解锁取决于它对应的内存中存储的值。共享内存一直存在,直到你删除它并且它不再被使用,所以如果你创建一个共享内存区域并在其中锁定它,它将保持锁定状态。如果互斥锁被解锁,它仍然会被初始化,因为共享内存段仍然存在。

如果您想要始终如一地生成一个在启动时解锁互斥锁的环境,请在生产者中使用 POSIX 与 O_TRUNC 共享内存,然后调用 ftruncatemmap 来分配你的内存,然后初始化互斥锁。消费者(或多个消费者)然后可以锁定互斥量并解锁互斥量,知道它已被创建。由于生产者截断了内存,因此那里的任何旧互斥锁状态都将被破坏。

也可以使用 SysV 共享内存执行此操作,但不太优雅。您只需在生产者中使用 IPC_RMID 删除要使用 shmctl 销毁的段,忽略任何错误,然后创建一个新的共享内存段。然后就可以在内存区初始化mutex了