Как / в каких случаях мьютекс может быть заблокирован несколько раз в одном потоке? - PullRequest
1 голос
/ 22 августа 2010

Я не понимаю использование мьютекса, если он может быть рекурсивно заблокирован потоком.Зачем кому-то рекурсивно блокировать мьютекс?В каких случаях они будут использовать это?

Ответы [ 2 ]

2 голосов
/ 22 августа 2010

Я не понимаю использование мьютекса если он может быть рекурсивно заблокирован нить.

Мьютекс используется для обеспечения взаимоисключающего доступа к ресурсу. Другими словами, только один поток (или «агент») должен иметь доступ к ресурсу за один раз. Поэтому, если поток получил мьютекс, он уже имеет монопольный доступ к ресурсу, поэтому нет никакого вреда, если он снова сможет использовать мьютекс.

Рекурсивный мьютекс все еще полезен, поскольку он все еще обеспечивает семантику монопольного доступа. В то время как Поток 1 может получить мьютекс, который у него уже есть, Потоку 2 по-прежнему запрещено принимать мьютекс и получать доступ к ресурсу одновременно с Потоком 1.

Почему кто-то хочет рекурсивно заблокировать мьютекс?

Для удобства: если мой поток обращается к ресурсу в нескольких разных классах, каждый из них может получать и освобождать мьютекс независимо и вложенным образом, не беспокоясь друг о друге. Это может рассматриваться как лень или плохой дизайн, но это преимущество перед нерекурсивными мьютексами, которые вызывают тупик, когда поток пытается получить мьютекс, которым он уже владеет.

0 голосов
/ 22 августа 2010

Кажется, вы запрашиваете возможный вариант использования блокировки повторного входа.Можно было бы использовать обратный вызов чего-либо.У вас может быть метод, который блокирует объект, а затем вызывает что-то еще, предоставляя обратный вызов с доступом к этому объекту.Если для этого объекта вызывается другой метод, он также может захотеть получить блокировку.Для них обоих совершенно безопасно иметь блокировку, они не могут работать одновременно, они находятся в одном потоке.

...