Linux - время жизни разделяемого мьютекса и переменной cond - PullRequest
0 голосов
/ 20 июня 2020

Я создал общий мьютекс и условную переменную в общей памяти для связи между двумя процессами (производителем и потребителем), если я закрою оба приложения и снова запущу, я могу заблокировать, разблокировать мьютекс и условную переменную сигнала, не воссоздавая их в общей память снова, мьютекс и переменная cond работают нормально без их воссоздания, как это возможно? совместное использование мьютекса и переменной cond делает их пожизненными до перезапуска машины? Примечание: если я нажму ctrl + c и прерву потребителя и снова перезапущу, оба приложения заблокированы, и мне нужно удалить / dev / shm / ipcfile.

1 Ответ

1 голос
/ 20 июня 2020

Будет ли мьютекс заблокирован или разблокирован, зависит от значений, хранящихся в соответствующей ему памяти. Общая память сохраняется до тех пор, пока вы ее не удалите, и она больше не будет использоваться, поэтому, если вы создадите область общей памяти с мьютексом и заблокируете ее, она останется заблокированной. Если мьютекс разблокирован, он все равно будет инициализирован, поскольку сегмент разделяемой памяти сохраняется.

Если вы хотите постоянно создавать среду, в которой ваш мьютекс разблокируется при запуске, используйте общую память POSIX с O_TRUNC в производителе, а затем вызовите ftruncate и mmap, чтобы выделить вашу память, а затем инициализируйте мьютекс. Затем потребитель (или несколько потребителей) может заблокировать мьютекс и разблокировать мьютекс, зная, что он был создан. Поскольку производитель усекает память, любое старое состояние мьютекса будет уничтожено.

Это также возможно сделать с общей памятью SysV, но немного менее элегантно. Вы просто удалите сегмент, который будет уничтожен, с помощью shmctl, используя IPC_RMID в производителе, игнорируя любые ошибки, а затем создайте новый сегмент общей памяти. Затем вы можете инициализировать мьютекс в области памяти.

...