#c++ #многопоточность #c++11 #mutex
Как известно, Задача мьютекса — защита объекта от доступа к нему других потоков, отличных от того, который завладел мьютексом. В каждый конкретный момент только один поток может владеть объектом, защищённым мьютексом. Если другому потоку будет нужен доступ к переменной, защищённой мьютексом, то этот поток блокируется до тех пор, пока мьютекс не будет освобождён. Но как мьютекс определяет, доступ к какому именно ресурсу/объекту/переменной нужно блокировать? Ведь в него не передается никаких параметров, из которых он мог бы знать что именно защищать. Если что, речь о std::mutex, с++11.
Ответы
Ответ 1
Дополню ответ @alexis031182. Мьютекс или семафор, как его обобщение (конкретно, объект (переменная), расположенный по некоторому адресу) это точка синхронизации потоков кода одного или (в некоторых случаях) нескольких процессов. И ничего более. Он ничего не защищает. Ни объекты в памяти, ни участки кода. Поток не вызывающий операцию lock с этим мьютексом может делать что хочет с любыми переменными и участками кода. Защита производится на логическом уровне (в голове разработчика). Фактически поток кода, вызвавший операцию lock для указанного мьютекса увеличивает счетчик, связанный с этим мьютексом и продолжает выполнение если счетчик был равен нулю. В противном случае этот поток ожидает, пока счетчик не станет равен 0 (тогда он в свою очередь увеличит его и продолжит выполняться), что произойдет, когда кто-то вызовет unlock, уменьшающий счетчик на 1.Ответ 2
По сути, никак. Он и не защищает конкретный объект. Мьютекс лишь гарантирует, что обращения к данным под мьютексом сериализованы. (То есть, что невозможны гонки данных.) Ответственность работать с нужными объектами возлагается на вас, программиста. То, что вы описали, говорит не о том, что делает мьютекс, а лишь о том, для чего он предназначен, и что вы можете при помощи него делать (сами).Ответ 3
У любого мютекса есть функции lock и unlock (они могут называться по разному, но суть от этого не меняется. Некоторые мютексы могут использовать raii, автоматически вызывая нужные функции). А защищает он кусок кода, который не может быть исполнен, если мютекс в залоченном состоянии. То есть, один мютекс может защищать много различных мест и они не будут исполнены одновременно (актуально при многопоточном выполнении). С другой стороны, в системе может существовать много мютексов одновременно и они не будут мешать друг-дружке.Ответ 4
Мьютекс по сути обеспечивает то, что называется «критической секцией» (критическим разделом) - т.е. код, который может выполняться одновременно только одним потоком. Но если данный мьютекс навесить на код, который обращается к некоторой переменной - то создается впечатление, что он защищает объект, а не фрагмент кода.Ответ 5
Позвольте аллегорию... Кто раньше встал, того и тапки. Нет никакой необходимости отмечать сей факт на них самих. Первый надел - владей, ты победил. Соответственно, кто не успел, тот опоздал, и будет пребывать в унылом ожидании, пока столь полезный, но совершенно неразделяемый ресурс не будет освобождён. Конечно, в какой-то мере пример притянут за уши, поскольку в реальной жизни нельзя исключить вариант силового решения вопроса. Но речь о мьютексах, а потому безусловность контроля за процессом передела имущества само собой разумеется. Лишь добрая воля счастливчика, на этот раз успевшего первым, позволит другому воспользоваться предметом вожделенного комфорта. Сам себя дополню. С тапками аллегория не получилось потому, что многие могут представить себе рабочее существование без них. А суть не в тапках, а в контексте выполнения. Посредством мьютекса контекст выполнения одного потока блокирует/высвобождает контекст выполнения другого или других. А так - да, тапки ни при чём, дело в голове. — Кстати, д’Артаньян: я слышал, что некий Милон Кротонский проделывал удивительные вещи. Он, например, обматывал голову верёвкой и одним движением головных мускулов!!!… разрывал её. Он сбивал быка одним ударом кулака и уносил его на своих плечах… ну, и тому подобное. Я, когда узнал обо всём этом… Я проделал у себя в Пьерфоне… ну, всё то же самое, что и этот Милон. За исключением одного: я никак не мог разорвать головой верёвку. — Это оттого, что у Вас сила… не в голове.
Комментариев нет:
Отправить комментарий