Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Заблокирован

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

02.12.2013, 17:44. Показов 2137. Ответов 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)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.12.2013, 17:44
Ответы с готовыми решениями:

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

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

Операция присваивания
Вот что говорится в хелпе про составное присванивание. Форма e1 op= e2 ведет себя как e1 = e1 op e2, но e1 вычисляется только один раз. ...

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

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

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


Ну тогда, если WinApi - то Interlocked функции и нет проблем
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
03.12.2013, 11:56
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от 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
Заблокирован
03.12.2013, 12:02  [ТС]
да честно говоря я даже volatile не особо доверяю, понял - буду действовать через синхронизацию потоков, темпаче мне это для CUDA вообще надо )))) Там есть свои примитивы синхронизации
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.12.2013, 12:02
Помогаю со студенческими работами здесь

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

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

Преобразование типов в операция присваивания
Добрый вечер, форумчане. Я новичок в программировании, изучаю C++. Читаю книгу "C++ Шаг за шагом" - Герберт Шилдт. Прошу вас...

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

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru