Страницы

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

среда, 10 апреля 2019 г.

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

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


Ответ

Два параллельных потока выполнения представляете? Нет никаких гарантий, кто что и когда делает. Вплоть до того, что вы выполняете присваивание типа
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() вторым потоком завершится, и он сможет выполнять свое присваивание.
Примерно так...

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

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