2015-02-19 3 views
0

Я использую pthread_mutex_t, чтобы синхронизировать доступ к ресурсу между несколькими процессами, которые находятся на одном уровне (т. Е. Не существует отношения родительский/дочерний).pthread_mutex_t в нескольких процессах ... кто его уничтожает?

Как определить, когда можно безопасно вызвать pthread_mutex_destroy? Единственный способ, с помощью которого я могу определить, используется ли мьютекс другим процессом без введения условия гонки, - это ввести другой мьютекс.

+0

«Я использую pthread_mutex_t ... между несколькими процессами ". Я нахожу это маловероятным, поскольку мьютексы PThreads являются локальными для отдельных процессов. Возможно, вы думаете о мьютексах SYSV или о другой реализации? – twalberg

+0

Вы создаете их в общей памяти и вызываете pthread_mutexattr_setpshared с PTHREAD_PROCESS_SHARED – user109078

+0

В этом случае он, вероятно, небезопасен, пока вы не сможете: 1) гарантировать, что он не заблокирован или 2) гарантировать, что этот процесс является единственным, который все еще подключен к этому сегменту разделяемой памяти. Если есть другие связанные процессы, или если у вас нет способа сказать, заблокирован ли он, тогда уничтожение может привести к плохим вещам ... – twalberg

ответ

0

Off верхней части моей головы -

  1. использовать семафор (или общий счетчик памяти, по этому вопросу)
  2. постановить, что лидер (первый процесс создания мьютекса) является тот, который уничтожит его, и не выйдет из этого процесса до тех пор, пока остальные их не остановятся.
  3. Создать мьютекс извне, и удалить его наружно - процессы принимают это как должное (возможно, даже не удалять его, зависит от системы)

и т.д ...

+0

Разве не просто ударить по тропе вниз по дороге? У вас будет такая же проблема? 2 и 3 для меня не варианты. – user109078

+0

Зачем вам такая же проблема? Каждый пользователь поднимает ctr и освобождает его перед выходом. Как только он достигает 0, он убивает мьютекс и семафор. Из любопытства, почему два других не подходят для вас? –

+0

Потому что вам нужно заблокировать счетчик нет? Операция должна быть атомарной. Я не могу сделать 2, потому что на самом деле нет лидера, дизайн приложения уже диктует, что каждый экземпляр приложения определяет его собственное время жизни. Аналогичные причины для 3. – user109078

Смежные вопросы