Это не сработает, потому что у вас есть состояние гонки. Если два потока попытаются одновременно захватить блокировку, оба увидят available == 0
, и оба подумают, что им удалось получить мьютекс.
Если вы хотите сделать это правильно и без использования уже существующей блокировки, вы должны получить доступ к аппаратным операциям, таким как TAS, CAS и т. Д.
Существуют алгоритмы, которые дают вам взаимное исключение без такой аппаратной поддержки, но они делают некоторые предположения, которые много раз неверны. Для получения более подробной информации об этом, я настоятельно рекомендую прочитать книгу Херлихи и Шавита Искусство многопроцессорного программирования , глава 7.
Вы не должны беспокоиться о взаимоблокировках на этом уровне - блокировки мьютексов должны быть достаточно простыми, и есть некоторые предположения, что программист, использующий их, должен соблюдать осторожность, чтобы не вызывать взаимоблокировки (расширенные мьютексы могут проверять самоблокировку, что означает поток, который вызывает блокировку дважды без вызова разблокировки в середине).