Проверьте, не заблокировал ли Thread мьютекс перед блокировкой. - PullRequest
0 голосов
/ 01 февраля 2012

Перед тем, как поток заблокирует мьютекс, я хочу проверить, получил ли он уже блокировку этого мьютекса , поэтому я не могу этого сделать :

Acquire mutex
Acquire mutex

// do something here

Release mutex

// still has mutex lock at this point!!

Я знаю, что яЯ мог бы просто использовать здесь bool, но хотел знать, существует ли что-то уже.

Спасибо.

Ответы [ 4 ]

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

Слишком долго для комментария, поэтому извиняюсь, что это ответ ..

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

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

В общем, избегайте рекурсивных мьютексов, если можете ...

0 голосов
/ 01 февраля 2012

Какой API вы используете?Это важно, потому что, если, например, это двойной вызов Win32 API к WaitForSingleObject в одном потоке на одном мьютексе, вам не нужно вызывать ReleaseMutex два раза.

Однако в любом случае это рискованный код

0 голосов
/ 01 февраля 2012

Если вы используете реализацию мьютекса конкретной платформы (Win32?), То вам следует обратиться к документации этой платформы.

Если вы используете стандартный мьютекс C ++ 11 - std :: mutex, переключитесь на std :: recursive_mutex.Обратите внимание, что вам нужно будет вызывать unlock () для каждого вызова lock ().

0 голосов
/ 01 февраля 2012

Расследование РАИИ.Это перестанет беспокоиться об этой проблеме.

...