Почему не рекомендуется вызывать метод release () двоичного семафора из предложения finally? - PullRequest
3 голосов
/ 02 февраля 2012

Чтобы убедиться, что Lock разблокирован, рекомендуется вызывать метод unlock() из предложения finally:

lock.lock();
try{
  // critical section which may throw exceptions
} finally {
  lock.unlock();
}

Во избежание возможной тупиковой ситуации, в случаеисключение выдается из кода в критическом разделе.

Почему такая же практика не рекомендуется для двоичных семафоров в эквивалентных сценариях?

mutex.acquire();
try{
  // critical section which may throw exceptions
} finally {
  mutex.release();
}

Ответы [ 3 ]

3 голосов
/ 02 февраля 2012

Я бы сказал, что, как правило, это лучший способ справиться с ними.Семафоры, однако, могут быть освобождены отдельным потоком, поэтому в некоторых сложных случаях этот шаблон невозможен.(при этом для вызовов Lock lock() и unlock() возможны отдельные методы, так что блок finally также невозможен).

1 голос
/ 02 февраля 2012

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

1 голос
/ 02 февраля 2012

Я бы посоветовал сделать это так. Но главное различие между семафором и замком состоит в том, что нет владельцев семафора. Это означает, что поток, который получил семафор, может быть не тем, кто его выпустил, и это нормально. Я бы предложил всегда выпускать в блоке finally в какой-то момент

...