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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
newbie666
Заблокирован
#1

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

02.12.2013, 17:44. Просмотров 402. Ответов 11
Метки нет (Все метки)

?

Добавлено через 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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2013, 17:44     Атомарна ли операция присваивания в однопроцессорной машине?
Посмотрите здесь:

Атомарна ли операция битового сдвига? - C++
Система: Win7 x64. Один проц Intel i7 3770k. Предположим, что я в студии собираю 64-х битным компилятором проект, в котором есть: ...

Операция присваивания (=) - C++
Добрый день, интересует вот что: правильно ли я считаю, что в int x = .0 + 1F + 4L; 1) Сперва все операнды сложения (по правую...

операция присваивания - C++
Столкнулся с глупой проблемой, может кто объяснить, как в таком случае делается присваивание и в чем у меня ошибка? int a=1, b=2, c=3,...

Операция присваивания - C++
Чем отличается операция присваивания "/=" от "=" ?

Конструктор копирования и операция присваивания в классе - C++
Народ, вот есть такие объявления(motto - объект класса StringBad): StringBad ditto(motto); StringBad metoo = motto; StringBad...

Правильно сделана перегруженная операция присваивания? - C++
Проверьте, пожалуйста, эту часть. Программа неправильно работает и думаю ошибка в операторе присваивания // узел template<typename...

Что быстрее, операция присваивания или сравнения? - C++
Всем доброго времени суток, такой вод у меня дурацкий вопрос сидит в голове, "Что быстрее, операция присваивания или сравнения?". Вот...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,353
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 ?
Убежденный
Системный программист
Эксперт С++
15241 / 6873 / 1088
Регистрация: 02.05.2013
Сообщений: 11,254
Завершенные тесты: 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 операции с памятью атомарны, при условии, что операция выполняется за
одну элементарную инструкцию
а если это двухпроцессорная система, то и одна инструкция не гарантия, т.к. разные процессоры могут каждый по одной инструкции параллельно запустить для обращения к памяти?
Убежденный
Системный программист
Эксперт С++
15241 / 6873 / 1088
Регистрация: 02.05.2013
Сообщений: 11,254
Завершенные тесты: 1
02.12.2013, 21:01     Атомарна ли операция присваивания в однопроцессорной машине? #6
Цитата Сообщение от newbie666 Посмотреть сообщение
а если это двухпроцессорная система, то и одна инструкция не гарантия
Гарантии атомарности одинаковы, что для однопроцессорных систем, что для многопроцессорных.
Правда, у многопроцессорных свои дополнительные особенности.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,353
03.12.2013, 10:44     Атомарна ли операция присваивания в однопроцессорной машине? #7
Цитата Сообщение от newbie666 Посмотреть сообщение
То есть если я из B скопирую значение в EAX, существует вероятность, что после этой команды другой поток скопирует сюда ещё другое значение и только после этого она запишется из EAX в A ?
Во! Вот именно это я и хотел тебе продемонстрировать.
Резюме: если операция присваивания гарантированно выполняется за одну машинную инструкцию, она будет атомарной. Если за две или более инструкций - никаких гарантий атомарности нет.

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

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


Ну тогда, если WinApi - то Interlocked функции и нет проблем
Убежденный
Системный программист
Эксперт С++
15241 / 6873 / 1088
Регистрация: 02.05.2013
Сообщений: 11,254
Завершенные тесты: 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++
Добрый день! Помогите, пожалуйста, разобраться. Я не совсем понимаю работу перегруженного оператора присваивания в классе String, который...

оператор присваивания - C++
Подскажите пожалуйста, вот я создал класс, конструктор которого создает 2хмерный массив из 2ойного указателя, являющейся членом этого...

Об операторе присваивания - C++
можно "перевести"?

Ошибка присваивания - C++
Доброго времени суток. Почему запрещено такое присваивание, компилятор выдает ошибку. VS 2015 vector <string> word; string buffer =...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru