Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

02.12.2013, 17:44. Просмотров 426. Ответов 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
верно?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2013, 17:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Атомарна ли операция присваивания в однопроцессорной машине? (C++):

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

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

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

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

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

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

11
CheshireCat
Эксперт С++
2895 / 1244 / 78
Регистрация: 27.05.2008
Сообщений: 3,397
02.12.2013, 17:49 #2
А как насчет
C++
1
2
3
int a = 5;
int b = 8;
a = b;
?
0
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 ?
0
Убежденный
Ушел с форума
Эксперт С++
15697 / 7207 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
02.12.2013, 20:00 #4
Цитата Сообщение от newbie666 Посмотреть сообщение
Атомарна ли операция присваивания в однопроцессорной машине?
На IA-32/AMD64 операции с памятью атомарны, при условии, что операция выполняется за
одну элементарную инструкцию (типа mov, а вот inc уже не катит, ибо это read-modify-write) и
данные корректно выровнены или хотя бы находятся в пределах одной кэш-линии процессора.
1
newbie666
Заблокирован
02.12.2013, 20:53  [ТС] #5
Цитата Сообщение от Убежденный Посмотреть сообщение
На IA-32/AMD64 операции с памятью атомарны, при условии, что операция выполняется за
одну элементарную инструкцию
а если это двухпроцессорная система, то и одна инструкция не гарантия, т.к. разные процессоры могут каждый по одной инструкции параллельно запустить для обращения к памяти?
0
Убежденный
Ушел с форума
Эксперт С++
15697 / 7207 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
02.12.2013, 21:01 #6
Цитата Сообщение от newbie666 Посмотреть сообщение
а если это двухпроцессорная система, то и одна инструкция не гарантия
Гарантии атомарности одинаковы, что для однопроцессорных систем, что для многопроцессорных.
Правда, у многопроцессорных свои дополнительные особенности.
1
CheshireCat
Эксперт С++
2895 / 1244 / 78
Регистрация: 27.05.2008
Сообщений: 3,397
03.12.2013, 10:44 #7
Цитата Сообщение от newbie666 Посмотреть сообщение
То есть если я из B скопирую значение в EAX, существует вероятность, что после этой команды другой поток скопирует сюда ещё другое значение и только после этого она запишется из EAX в A ?
Во! Вот именно это я и хотел тебе продемонстрировать.
Резюме: если операция присваивания гарантированно выполняется за одну машинную инструкцию, она будет атомарной. Если за две или более инструкций - никаких гарантий атомарности нет.

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

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


Ну тогда, если WinApi - то Interlocked функции и нет проблем
0
Убежденный
Ушел с форума
Эксперт С++
15697 / 7207 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 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"
3
newbie666
Заблокирован
03.12.2013, 12:02  [ТС] #12
да честно говоря я даже volatile не особо доверяю, понял - буду действовать через синхронизацию потоков, темпаче мне это для CUDA вообще надо )))) Там есть свои примитивы синхронизации
0
03.12.2013, 12:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2013, 12:02
Привет! Вот еще темы с ответами:

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

Модель однопроцессорной вычислительной системы разделения времени - C++
разработать программу, моделир. один из алгоритмов управл. процессами в соответствии с вариантом задания. При моделировании считать что: ...

Атомарна ли операция присваивания и чтения POD данных? - C++ WinAPI
Привет! Терзают меня сомнения по поводу необходимости критической секции в следующие ситуации: Есть класс, в нём есть поля простых типов...

Тонкости работы многозадачной системы на однопроцессорной машине - Программирование
Вопросы, появившиеся после прочтения статьи Evg "Потоки vs процессы". Там и системы с несколькими физическими процессорами, и системы...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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