Страницы

Поиск по вопросам

среда, 27 ноября 2019 г.

Как mutex определяет, какой именно объект нужно блокировать?

#c++ #многопоточность #c++11 #mutex


Как известно,


  Задача мьютекса — защита объекта от доступа к нему других потоков,
  отличных от того, который завладел мьютексом. В каждый конкретный
  момент только один поток может владеть объектом, защищённым мьютексом.
  Если другому потоку будет нужен доступ к переменной, защищённой
  мьютексом, то этот поток блокируется до тех пор, пока мьютекс не будет
  освобождён.


Но как мьютекс определяет, доступ к какому именно ресурсу/объекту/переменной нужно
блокировать? Ведь в него не передается никаких параметров, из которых он мог бы знать
что именно защищать. 

Если что, речь о std::mutex, с++11. 
    


Ответы

Ответ 1



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

Ответ 2



По сути, никак. Он и не защищает конкретный объект. Мьютекс лишь гарантирует, что обращения к данным под мьютексом сериализованы. (То есть, что невозможны гонки данных.) Ответственность работать с нужными объектами возлагается на вас, программиста. То, что вы описали, говорит не о том, что делает мьютекс, а лишь о том, для чего он предназначен, и что вы можете при помощи него делать (сами).

Ответ 3



У любого мютекса есть функции lock и unlock (они могут называться по разному, но суть от этого не меняется. Некоторые мютексы могут использовать raii, автоматически вызывая нужные функции). А защищает он кусок кода, который не может быть исполнен, если мютекс в залоченном состоянии. То есть, один мютекс может защищать много различных мест и они не будут исполнены одновременно (актуально при многопоточном выполнении). С другой стороны, в системе может существовать много мютексов одновременно и они не будут мешать друг-дружке.

Ответ 4



Мьютекс по сути обеспечивает то, что называется «критической секцией» (критическим разделом) - т.е. код, который может выполняться одновременно только одним потоком. Но если данный мьютекс навесить на код, который обращается к некоторой переменной - то создается впечатление, что он защищает объект, а не фрагмент кода.

Ответ 5



Позвольте аллегорию... Кто раньше встал, того и тапки. Нет никакой необходимости отмечать сей факт на них самих. Первый надел - владей, ты победил. Соответственно, кто не успел, тот опоздал, и будет пребывать в унылом ожидании, пока столь полезный, но совершенно неразделяемый ресурс не будет освобождён. Конечно, в какой-то мере пример притянут за уши, поскольку в реальной жизни нельзя исключить вариант силового решения вопроса. Но речь о мьютексах, а потому безусловность контроля за процессом передела имущества само собой разумеется. Лишь добрая воля счастливчика, на этот раз успевшего первым, позволит другому воспользоваться предметом вожделенного комфорта. Сам себя дополню. С тапками аллегория не получилось потому, что многие могут представить себе рабочее существование без них. А суть не в тапках, а в контексте выполнения. Посредством мьютекса контекст выполнения одного потока блокирует/высвобождает контекст выполнения другого или других. А так - да, тапки ни при чём, дело в голове. — Кстати, д’Артаньян: я слышал, что некий Милон Кротонский проделывал удивительные вещи. Он, например, обматывал голову верёвкой и одним движением головных мускулов!!!… разрывал её. Он сбивал быка одним ударом кулака и уносил его на своих плечах… ну, и тому подобное. Я, когда узнал обо всём этом… Я проделал у себя в Пьерфоне… ну, всё то же самое, что и этот Милон. За исключением одного: я никак не мог разорвать головой верёвку. — Это оттого, что у Вас сила… не в голове.

Комментариев нет:

Отправить комментарий