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