До недавнего времени я рассматривал мьютексы проверки ошибок главным образом как инструмент отладки с небольшим значением в правильном коде, но потом я понял, что у них есть свойство заменять рекурсивные мьютексы, как в:
void foo()
{
int ok_to_unlock = !pthread_mutex_lock(m);
/* do something */
if (ok_to_unlock) pthread_mutex_unlock(m);
}
Обратите внимание, что pthread_mutex_lock
возвращает 0 в случае успеха и EDEADLK
, если вызывающая сторона уже удерживает блокировку. Преимущество такого использования заключается в том, что вам не нужно беспокоиться о превышении произвольного предела рекурсивной блокировки; «Счетчик блокировок» неявно присутствует в кадре вызова. В принципе, эта идиома может также работать немного лучше, поскольку вызов функции pthread_mutex_unlock
никогда не выполняется, когда вызывающий поток уже удерживал блокировку.
Мой вопрос, в основном, касается стиля: не мешает ли использование мьютексов для проверки ошибок, подобных этому, ясность кода? Есть ли другие причины, по которым вы бы не хотели их использовать?