pthread mutex разблокировать почему же поток? - PullRequest
0 голосов
/ 16 сентября 2011

Может быть основной вопрос ?.

1) Почему мьютекс должен быть разблокирован в том же потоке?У нас есть какая-то конкретная причина?2) Зачем сохранять pthraed_mutex_lock, если sem_wait / sem_post достигает того же, если я правильно понимаю?

Ответы [ 3 ]

1 голос
/ 16 сентября 2011

Мьютекс разработан, чтобы быть чрезвычайно быстрым и легким в наиболее распространенном случае. Наиболее распространенный случай - когда поток входит в критическую секцию, выполняет несколько быстрых изменений общего состояния и затем выходит из критической секции. Если у вас есть более сложные требования, используйте более сложный объект синхронизации. Но обычно мьютекс pthread будет легче, чем почти любой другой примитив синхронизации.

1 голос
/ 16 сентября 2011

Хотя их иногда можно использовать взаимозаменяемо, мьютексы и семафоры имеют очень разные концептуальные основы.Степень, в которой их фактическое поведение отличается, зависит от вашего конкретного приложения.

Мьютекс концептуально имеет владельца - один поток, который, согласно соглашению / контракту, программист рассматривает как единственный разрешенный потокчтобы получить доступ к ресурсам, которые защищает мьютекс.В зависимости от типа мьютекса и его реализации, владелец может быть чисто формальной конструкцией или фактическим полем, хранящимся в объекте мьютекса.Например, для мьютексов с рекурсивной проверкой или проверкой ошибок сохранение владельца позволяет потоку, который владеет мьютексом, получать дополнительные ссылки на него или получать ошибку, если он пытается повторно заблокировать его, пока блокировка еще удерживается, соответственно.

Семафор, с другой стороны, по сути своей является счетчиком.Ожидание семафора не обязательно связано с получением исключительных прав на использование ресурса, хотя, конечно, это одно из потенциальных приложений (семафор, который принимает только значения 0 и 1, может использоваться как мьютекс).Семафоры могут использоваться для многих других приложений, таких как ожидание / сигнализация - например, один поток может зацикливаться на ожидании семафора N раз, чтобы дождаться отправки потоков N на него, где каждый поток публикует сообщения после завершения задачи.,Фактически, объект синхронизации, эквивалентный условным переменным, также может быть реализован в терминах семафоров.Они также могут использоваться просто как переносной атомный счетчик (проводка для увеличения счетчика), среди многих других применений.«Классическое» использование семафора состоит в том, чтобы представлять количество доступных ресурсов из N эквивалентных ресурсов и облегчать ожидание, когда нет доступных ресурсов, но лично я не думаю, что когда-либо использовал семафоры именно так.

Теперь, если вы хотите разобраться в особенностях мьютексов и семафоров POSIX , по большей части семафоры гораздо более мощные.Они могут использоваться не только для сигнализации условий;Операция post также async-signal-safe означает, что вы можете использовать ее без ограничений изнутри обработчиков сигналов.С другой стороны, мьютексы имеют одну особенность, которая не может быть реализована в терминах семафоров: атрибут robust mutex , который позволяет создавать мьютексы, которые позволяют другим потокам / процессам обнаруживать и восстанавливать, когда поток /процесс прекращается при удерживании мьютекса (а не просто взаимоблокировка).

0 голосов
/ 16 сентября 2011

Поскольку именно для этого семафор взаимного исключения , взаимное исключение (исключая все другие потоки, кроме этого).

Он предназначен для блокировки ресурса, чтобы у определенного потока выполнения был неограниченный доступ к нему.

«Обычные» семафоры (как в sem_wait/sem_post) считаются семафорами. Вы можете указать, что доступно N доступных ресурсов, а не только один по взаимному исключению. Конечно, вы можете эмулировать семафоры взаимного исключения с обычным разнообразием, но вы теряете некоторые средства защиты (например, гарантируя, что только владелец может разблокировать его).

...