Я собираюсь поговорить о Mutex против бинарного семафора. Очевидно, что вы используете мьютекс для предотвращения одновременного доступа к данным в одном потоке другим потоком.
(Предположим, что вы только что вызвали lock () и в процессе доступа к данным. Это означает, что вы не ожидаете, что какой-либо другой поток (или другой экземпляр того же кода потока) получит доступ к тем же данным заблокирован одним и тем же мьютексом. То есть, если один и тот же код потока выполняется на другом экземпляре потока, блокирует блокировку, то lock () должен блокировать поток управления.)
Это относится к потоку, который использует другой код потока, который также обращается к тем же данным и который также заблокирован тем же мьютексом.
В этом случае вы все еще находитесь в процессе доступа к данным, и вам может потребоваться, скажем, еще 15 секунд, чтобы достичь разблокировки мьютекса (чтобы другой поток, блокируемый блокировкой мьютекса, разблокировался и позволил контроль доступа к данным).
Вы когда-нибудь разрешаете другому потоку просто разблокировать тот же мьютекс и, в свою очередь, разрешаете потоку, который уже ожидает (блокирует) блокировку мьютекса, разблокировать и получить доступ к данным? (Надеюсь, вы поняли, что я говорю здесь.)
В соответствии с согласованным универсальным определением,
- с «мьютексом» этого не может быть. Никакая другая нить не может разблокировать замок
в вашей теме
- с «бинарным семафором» это может произойти. Любая другая тема может разблокировать
замок в твоей теме
Итак, если вы очень внимательно относитесь к использованию бинарного семафора вместо мьютекса, тогда вы должны быть очень осторожны в «определении» блокировок и разблокировок, я имею в виду, что каждый поток управления, который затрагивает каждую блокировку, должен включать разблокировку вызов, а также не должно быть никакой «первой разблокировки», скорее это всегда должна быть «первая блокировка».