Как известно,
Задача мьютекса — защита объекта от доступа к нему других потоков,
отличных от того, который завладел мьютексом. В каждый конкретный
момент только один поток может владеть объектом, защищённым мьютексом.
Если другому потоку будет нужен доступ к переменной, защищённой
мьютексом, то этот поток блокируется до тех пор, пока мьютекс не будет
освобождён.
Но как мьютекс определяет, доступ к какому именно ресурсу/объекту/переменной нужно блокировать? Ведь в него не передается никаких параметров, из которых он мог бы знать что именно защищать.
Если что, речь о std::mutex, с++11.
Ответ
Дополню ответ @alexis031182.
Мьютекс или семафор, как его обобщение (конкретно, объект (переменная), расположенный по некоторому адресу) это точка синхронизации потоков кода одного или (в некоторых случаях) нескольких процессов.
И ничего более. Он ничего не защищает. Ни объекты в памяти, ни участки кода. Поток не вызывающий операцию lock с этим мьютексом может делать что хочет с любыми переменными и участками кода. Защита производится на логическом уровне (в голове разработчика).
Фактически поток кода, вызвавший операцию lock для указанного мьютекса увеличивает счетчик, связанный с этим мьютексом и продолжает выполнение если счетчик был равен нулю.
В противном случае этот поток ожидает, пока счетчик не станет равен 0 (тогда он в свою очередь увеличит его и продолжит выполняться), что произойдет, когда кто-то вызовет unlock, уменьшающий счетчик на 1.
Комментариев нет:
Отправить комментарий