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