#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
.
Это не совсем так.
Mutex
не может быть освобожден никаким другим потоком.Semaphore
может быть использован в такой ситуации.