Страницы

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

пятница, 7 февраля 2020 г.

что такое неделимая операция семафора?

#cpp


"Неделимая операция - это операция, которая не может быть прервана."  Непонятно это
объяснение. Могли бы вы осветить более развернуто этот момент и если возможно с примером
кода.
    


Ответы

Ответ 1



Два параллельных потока выполнения представляете? Нет никаких гарантий, кто что и когда делает. Вплоть до того, что вы выполняете присваивание типа long long x = f(y); где long long - 8 байт, а запись при этом идет по 4 байта - пишется одно слово, затем второе. Так вот, параллельное выполнение не гарантирует не только что никто не вклинится между вычислением функции и присвоением результата, но что даже такое сохранение будет выполнено без вмешательства другого потока. И если есть Поток 1 Поток 2 x = 0xFFFF0000; x = 0xABCD1234; то в результате может оказаться, что x не равно ни первому значению, ни второму, а, скажем, x == 0xFFFF1234. Специально привел пример понеприятнее. А неделимая операция - во время выполнения которой переключение между потоками гарантированно не произойдет. Так более-менее понятно? Семафор - есть такой std::mutex, и если вы выполнили для него lock(), то пока не будет выполнен unlock(), все прочие операции lock() заставляют поток ожидать. std::mutex m; Поток 1 Поток 2 m.lock(); m.lock(); x = 0xFFFF0000; x = 0xABCD1234; m.unlock(); m.unlock(); Тут вы гарантируете, что как бы причудливо не переплетались эти потоки, но x не примет какого-то непонятного значения, а будет либо 0xFFFF0000, если первым захватил мьютекс второй поток, либо 0xABCD1234 - если первый. Т.е., например, первый поток пришел первым, вызвал lock(). Пришел второй поток, вызвал lock() - и остановился в ожидании, пока мьютекс не будет освобожден. Первый поток выполнил присваивание, вызвал unlock() и пошел дальше. И только теперь вызов lock() вторым потоком завершится, и он сможет выполнять свое присваивание. Примерно так...

Ответ 2



На практике я чаще встречаю синоним: атомарная операция (прямой перевод). Это операция, которая для "сторонних наблюдателей" (других потоков?) гарантированно не может быть "в процессе": она либо уже выполнилась, либо ещё не началась. Неделимая, потому что для наблюдателей снаружи она не может быть разделена на отдельные наблюдаемые шаги. Эти операции важны, когда к некоторому элементу данных обращаются несколько потребителей без синхронизации (никто не говорит им, когда смотреть можно, а когда нет), и каждый потребитель должен видеть этот элемент данных в целостном состоянии. Как семафор должен быть в состояниях закрыт/открыт.

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

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