Linux - 共享互斥锁和条件变量的生命周期是多少
Linux -what is lifetime of a shared mutex and cond variable
我在共享内存上创建了一个共享互斥锁和条件变量,用于两个进程(生产者和消费者)之间的通信,如果我关闭两个应用程序,然后再次 运行,我可以锁定、解锁互斥锁和条件信号变量而无需再次在共享内存上重新创建它们,mutex 和 cond 变量无需重新创建它们就可以正常工作,这怎么可能?使共享互斥锁和 cond 变量,使它们在重新启动机器之前一直有效?注意:如果我按 ctrl + c 并中断消费者并再次重新启动,则两个应用程序都已锁定,我需要删除 /dev/shm/ipcfile .
一个互斥量是被锁定还是被解锁取决于它对应的内存中存储的值。共享内存一直存在,直到你删除它并且它不再被使用,所以如果你创建一个共享内存区域并在其中锁定它,它将保持锁定状态。如果互斥锁被解锁,它仍然会被初始化,因为共享内存段仍然存在。
如果您想要始终如一地生成一个在启动时解锁互斥锁的环境,请在生产者中使用 POSIX 与 O_TRUNC
共享内存,然后调用 ftruncate
和 mmap
来分配你的内存,然后初始化互斥锁。消费者(或多个消费者)然后可以锁定互斥量并解锁互斥量,知道它已被创建。由于生产者截断了内存,因此那里的任何旧互斥锁状态都将被破坏。
也可以使用 SysV 共享内存执行此操作,但不太优雅。您只需在生产者中使用 IPC_RMID
删除要使用 shmctl
销毁的段,忽略任何错误,然后创建一个新的共享内存段。然后就可以在内存区初始化mutex了
我在共享内存上创建了一个共享互斥锁和条件变量,用于两个进程(生产者和消费者)之间的通信,如果我关闭两个应用程序,然后再次 运行,我可以锁定、解锁互斥锁和条件信号变量而无需再次在共享内存上重新创建它们,mutex 和 cond 变量无需重新创建它们就可以正常工作,这怎么可能?使共享互斥锁和 cond 变量,使它们在重新启动机器之前一直有效?注意:如果我按 ctrl + c 并中断消费者并再次重新启动,则两个应用程序都已锁定,我需要删除 /dev/shm/ipcfile .
一个互斥量是被锁定还是被解锁取决于它对应的内存中存储的值。共享内存一直存在,直到你删除它并且它不再被使用,所以如果你创建一个共享内存区域并在其中锁定它,它将保持锁定状态。如果互斥锁被解锁,它仍然会被初始化,因为共享内存段仍然存在。
如果您想要始终如一地生成一个在启动时解锁互斥锁的环境,请在生产者中使用 POSIX 与 O_TRUNC
共享内存,然后调用 ftruncate
和 mmap
来分配你的内存,然后初始化互斥锁。消费者(或多个消费者)然后可以锁定互斥量并解锁互斥量,知道它已被创建。由于生产者截断了内存,因此那里的任何旧互斥锁状态都将被破坏。
也可以使用 SysV 共享内存执行此操作,但不太优雅。您只需在生产者中使用 IPC_RMID
删除要使用 shmctl
销毁的段,忽略任何错误,然后创建一个新的共享内存段。然后就可以在内存区初始化mutex了