Форум программистов, компьютерный форум CyberForum.ru

Атомарна ли операция присваивания в однопроцессорной машине? - C++

Восстановить пароль Регистрация
 
newbie666
Заблокирован
02.12.2013, 17:44     Атомарна ли операция присваивания в однопроцессорной машине? #1
?

Добавлено через 1 минуту
судя по это - атомарна
C++
1
2
3
4
    18:     int a = 5;
0117C760 C7 45 E8 05 00 00 00 mov         dword ptr [a],5  
    19:     a = 8;
0117C767 C7 45 E8 08 00 00 00 mov         dword ptr [a],8
верно?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
02.12.2013, 17:49     Атомарна ли операция присваивания в однопроцессорной машине? #2
А как насчет
C++
1
2
3
int a = 5;
int b = 8;
a = b;
?
newbie666
Заблокирован
02.12.2013, 17:55  [ТС]     Атомарна ли операция присваивания в однопроцессорной машине? #3
Цитата Сообщение от CheshireCat Посмотреть сообщение
А как насчет

C++
1
2
3
4
5
6
7
    18:     int a = 3;
00EAC760 C7 45 E8 03 00 00 00 mov         dword ptr [a],3  
    19:     int b = 5;
00EAC767 C7 45 DC 05 00 00 00 mov         dword ptr [b],5  
    20:     a = b;
00EAC76E 8B 45 DC             mov         eax,dword ptr [b]  
00EAC771 89 45 E8             mov         dword ptr [a],eax
Рассуждаем дальше, тут видно две инструкции. Во время приравнивания а к b сначала копируем значение b в EAX, потом из EAX копируем значение в память в a.
Машинка однопроцессорная и не смотря на наличие нескольких потоков - одновременно может выполнятся только одна инструкция. Тоесть если я из B скопирую значение в EAX, существует вероятность, что после этой команды другой поток скопирует сюда ещё другое значение и только после этого она запишется из EAX в A ?
Убежденный
Системный программист
 Аватар для Убежденный
14175 / 6190 / 981
Регистрация: 02.05.2013
Сообщений: 10,297
Завершенные тесты: 1
02.12.2013, 20:00     Атомарна ли операция присваивания в однопроцессорной машине? #4
Цитата Сообщение от newbie666 Посмотреть сообщение
Атомарна ли операция присваивания в однопроцессорной машине?
На IA-32/AMD64 операции с памятью атомарны, при условии, что операция выполняется за
одну элементарную инструкцию (типа mov, а вот inc уже не катит, ибо это read-modify-write) и
данные корректно выровнены или хотя бы находятся в пределах одной кэш-линии процессора.
newbie666
Заблокирован
02.12.2013, 20:53  [ТС]     Атомарна ли операция присваивания в однопроцессорной машине? #5
Цитата Сообщение от Убежденный Посмотреть сообщение
На IA-32/AMD64 операции с памятью атомарны, при условии, что операция выполняется за
одну элементарную инструкцию
а если это двухпроцессорная система, то и одна инструкция не гарантия, т.к. разные процессоры могут каждый по одной инструкции параллельно запустить для обращения к памяти?
Убежденный
Системный программист
 Аватар для Убежденный
14175 / 6190 / 981
Регистрация: 02.05.2013
Сообщений: 10,297
Завершенные тесты: 1
02.12.2013, 21:01     Атомарна ли операция присваивания в однопроцессорной машине? #6
Цитата Сообщение от newbie666 Посмотреть сообщение
а если это двухпроцессорная система, то и одна инструкция не гарантия
Гарантии атомарности одинаковы, что для однопроцессорных систем, что для многопроцессорных.
Правда, у многопроцессорных свои дополнительные особенности.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
03.12.2013, 10:44     Атомарна ли операция присваивания в однопроцессорной машине? #7
Цитата Сообщение от newbie666 Посмотреть сообщение
То есть если я из B скопирую значение в EAX, существует вероятность, что после этой команды другой поток скопирует сюда ещё другое значение и только после этого она запишется из EAX в A ?
Во! Вот именно это я и хотел тебе продемонстрировать.
Резюме: если операция присваивания гарантированно выполняется за одну машинную инструкцию, она будет атомарной. Если за две или более инструкций - никаких гарантий атомарности нет.

Здесь, впрочем, еще очень-очень многое зависит от буйной фантазии разработчиков конкретного компилятора....
newbie666
Заблокирован
03.12.2013, 10:55  [ТС]     Атомарна ли операция присваивания в однопроцессорной машине? #8
Цитата Сообщение от CheshireCat Посмотреть сообщение
Здесь, впрочем, еще очень-очень многое зависит от буйной фантазии разработчиков конкретного компилятора....
да, спасибо! я понял. Я в принципе это знал, хотел убедиться наверняка. В общем, если сомневаешься, просто надо код дизассемблера смотреть да и всё
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
03.12.2013, 11:21     Атомарна ли операция присваивания в однопроцессорной машине? #9
Цитата Сообщение от newbie666 Посмотреть сообщение
В общем, если сомневаешься, просто надо код дизассемблера смотреть да и всё
Хо-хо. А потом при переносе на другой компилятор (или на новую версию того же самого компилятора, скажем, с MSVC++ 2012 на какой-нибудь MSVC++ 2015) все пересматривать заново? А если к этому моменту ты уже уволишься из конторы - окажутся ли твои бывшие коллеги достаточно догадливыми, чтобы пересмотреть? Ась?

ИМХО в профессиональном проекте закладываться на какие-то особенности кода, подсмотренные в дизассемблерном листинге, - это значит вставить мину замедленного действия в свой собственный код...
newbie666
Заблокирован
03.12.2013, 11:25  [ТС]     Атомарна ли операция присваивания в однопроцессорной машине? #10
Цитата Сообщение от CheshireCat Посмотреть сообщение
Хо-хо


Ну тогда, если WinApi - то Interlocked функции и нет проблем
Убежденный
Системный программист
 Аватар для Убежденный
14175 / 6190 / 981
Регистрация: 02.05.2013
Сообщений: 10,297
Завершенные тесты: 1
03.12.2013, 11:56     Атомарна ли операция присваивания в однопроцессорной машине? #11
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от newbie666 Посмотреть сообщение
В общем, если сомневаешься, просто надо код дизассемблера смотреть да и всё
Нет, это ненадежно.
Сегодня компилятор сгенерирует один код, завтра другой. Для корректного
параллельного программирования нужны гарантии, как на уровне языка/компилятора,
так и на уровне процессорной архитектуры. Если вы программируете в Visual C++,
то следует использовать или примитивы синхронизации, такие как критические секции,
мьютексы, семафоры, спин-блокировки и тому подобное, или Interlocked-функции,
или std::atomic/boost::atomic. Без этого максимум, на что можно рассчитывать -
это что операцию типа "a = 123" компилятор сведет к инструкции mov и тем самым
обеспечит ее атомарность. Но даже в этом случае могут возникнуть проблемы.
Например, если вместо "mov [mem], reg" компилятор сделает "mov reg, reg", то
другие потоки не получат нового значения переменной a, потому что запись пошла в
регистр, а не в память. Да и запись в память еще ничего не обещает в плане
видимости данных между потоками, так как у процессоров есть т.н. store buffers, в
которых они кэшируют операции записи некоторое время. Без использования "гарантий"
компилятор может перемешать инструкции в генерируемом машинном коде, так что
зависимые операции будут выполняться не в том порядке, который ожидается.
А потом то же самое может сделать CPU, если не указать ему обратное.

Эти вещи - часть одной большой трилогии под названием "atomicity, visibility, order"
(атомарность, видимость, порядок), их нельзя рассматривать поодиночке.

Парочка полезных ссылочек здесь: Что такое "volatile int"
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2013, 12:02     Атомарна ли операция присваивания в однопроцессорной машине?
Еще ссылки по теме:

Атомарна ли операция битового сдвига? C++
Оператор присваивания C++
операция присваивания C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
newbie666
Заблокирован
03.12.2013, 12:02  [ТС]     Атомарна ли операция присваивания в однопроцессорной машине? #12
да честно говоря я даже volatile не особо доверяю, понял - буду действовать через синхронизацию потоков, темпаче мне это для CUDA вообще надо )))) Там есть свои примитивы синхронизации
Yandex
Объявления
03.12.2013, 12:02     Атомарна ли операция присваивания в однопроцессорной машине?
Ответ Создать тему
Опции темы

Текущее время: 17:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru