我在共享内存上创建了一个共享互斥和条件变量,用于两个进程(生产者和消费者)之间的通信,如果我关闭这两个应用程序,并再次运行,我可以锁定,解锁互斥锁和信号条件变量,而不需要在共享内存上重新创建它们,互斥和条件变量在不重新创建它们的情况下工作良好,这是怎么可能的?使共享互斥和cond变量,使它们的生命周期,直到重启机器?注意:如果我按下ctrl +c并中断使用者并重新启动,两个应用程序都被锁定,并且我需要删除/dev/shm/ipcfile。
发布于 2020-06-21 03:35:57
互斥锁是锁定的还是解锁的取决于存储在内存中与之对应的值。共享内存会一直存在,直到您将其删除且不再使用,因此,如果您创建了一个包含互斥锁的共享内存区并将其锁定,它将保持锁定状态。如果互斥锁被解锁,它仍将被初始化,因为共享内存段仍然存在。
如果您希望始终生成一个互斥锁在启动时处于解锁状态的环境,请在生产者中使用POSIX与O_TRUNC共享内存,然后调用ftruncate和mmap来分配内存,然后初始化互斥锁。然后,使用者(或多个使用者)可以锁定互斥锁并解锁互斥锁,知道它已经被创建。因为生产者截断了内存,所以任何旧的互斥状态都将被销毁。
使用SysV共享内存也可以做到这一点,但不太优雅。您只需在生产者中使用IPC_RMID使用shmctl删除要销毁的段,忽略任何错误,然后创建一个新的共享内存段。然后,您可以在内存区中初始化互斥。
https://stackoverflow.com/questions/62489011
复制相似问题