двоичный семафор против мьютекса

#c #mutex #semaphore

#c #мьютекс #семафор

Вопрос:

Представьте, что у вас двойная блокировка:

 Ex:

mutex.lock();
mutex.lock();

Ex:

binarysemaphore.wait();
binarysemaphore.wait();
  

Будет ли поведение этих двух отличаться? Или они были бы одинаковыми.

Комментарии:

1. Я не знаком с термином «двойная блокировка». Вы имеете в виду «рекурсивный мьютекс»?

Ответ №1:

Я предполагаю, что вы имеете в виду рекурсивную блокировку (не двойную блокировку)

Будет ли операция отличаться, полностью зависит от платформы и реализации.

Я думаю, что в Windows по умолчанию мьютексы рекурсивны (поэтому работает реентерабельная блокировка), а семафоры — нет.

Однако в pthreads (POSIX) вы можете настроить его любым удобным для вас способом.

Комментарии:

1. 1 за указание на зависимость от платформы. Если я правильно помню, Posix поддерживает тип рекурсивной блокировки мьютекса, но он не переносим.

2. @Als: согласно моей справочной странице (и другим источникам ), pthread_mutexattr_gettype(PTHREAD_MUTEX_RECURSIVE <or> PTHREAD_MUTEX_NORMAL) должно быть доступно; просто PTHREAD_MUTEX_DEFAULT поведение не определено (т. Е. Зависит от платформы). Возможно, я не знаю о платформах со сломанной поддержкой pthreads

Ответ №2:

Во время исследований нам сказали, что Semaphore with max count = 1 равно Mutex .

Это не совсем так.

  1. Mutex не может быть освобожден никаким другим потоком.
  2. Semaphore может быть использован в такой ситуации.