Недавно у коллеги возникла проблема, которая сводилась к тому, что мы считаем следующей последовательностью событий в приложении С++ с двумя потоками:
-
В потоке A содержится мьютекс.
-
Пока поток A удерживает мьютекс, поток B пытается его заблокировать. Поскольку он удерживается, поток B приостанавливается.
-
Thread A завершает работу, в которой он поддерживает мьютекс, тем самым освобождая мьютекс.
-
Вскоре после этого поток A должен коснуться ресурса, который защищен мьютексом, поэтому он снова блокирует его.
-
Кажется, что поток A снова получает мьютекс; нить B все еще ждет, хотя сначала "спросила" о блокировке.
Соответствует ли эта последовательность событий семантике, например, С++ 11 std::mutex
и/или pthreads? Я могу честно сказать, что раньше я не думал об этом аспекте мьютексов.