Мьютексы используются для защиты критических секций. Допустим, мьютекс уже был отключен, и хотя поток, который это сделал, находится в CS, 10 других потоков находятся сразу за ним и отключают мьютекс, усыпляя себя. Когда первый поток выходит из критической секции и выполняет мьютекс, все 10 потоков просыпаются и просто возобновляют то, что они собирались сделать, а именно войти в критическую секцию? Не означает ли это, что все 10 могут одновременно оказаться в критической секции?
Что происходит с потоком, когда на его мьютексе выполняется операция up?
Ответы (1)
Нет, только один поток проснется и станет владельцем мьютекса. Остальные останутся спать. Какой поток пробуждается, обычно недетерминировано.
Вышеизложенное является обобщением, и детали реализации будут разными в каждой системе. Например, в Java сравните Object#notify() и Объект#notifyAll().
person
Greg Hewgill
schedule
17.03.2011
Когда эта нить просыпается, переходит ли она к следующему действию, которое собиралась сделать перед тем, как заснуть?
- person node ninja; 18.03.2011
Следующее, что он собирался сделать, это захватить мьютекс. Если мьютекс доступен и еще не был захвачен кем-то еще (такое может случиться), тогда да, он проснется и продолжит то, что делал.
- person Greg Hewgill; 18.03.2011
Когда несколько процессов отключают мьютекс, становится ли его значение ниже 0? Может ли его значение быть чем-то отличным от 0 или 1?
- person node ninja; 19.03.2011
@z-buffer: значение представляет собой концептуальный способ представления мьютекса, и данная реализация может иметь или не иметь числовое значение, связанное с мьютексом. Только один поток может получить и удерживать мьютекс в любой момент времени. Концептуально это может означать, что значение этого мьютекса может быть только 0 или 1.
- person Greg Hewgill; 20.03.2011