Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 18.09.2016, 13:21   #1
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Адрес: Самара
Сообщений: 289
Репутация: 147
По умолчанию Атомарность присвоения

У меня тут вопрос возник: будет ли обычное 32-битное присвоение (mov [X],eax), если переменная не выровнена по границе памяти, атомарным? Т.е. переменная 32-битная находится, скажем, по адресу 00FFFFFFh. Причём, прикол в том, что за-lock-ить её нельзя.
7in вне форума   Ответить с цитированием
Старый 18.09.2016, 13:40   #2
Пепел Феникса
Модератор
Заслуженный модератор
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 20,997
Репутация: 3402

icq: 446843180
skype: phoenix_proger
По умолчанию

не факт.
не спроста есть целое семейство Interlocked* функций.
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
__________________
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума   Ответить с цитированием
Старый 18.09.2016, 13:48   #3
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 12,790
Репутация: 2126
По умолчанию

Еще и от проца зависит...
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума   Ответить с цитированием
Старый 19.09.2016, 13:44   #4
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Адрес: Самара
Сообщений: 289
Репутация: 147
По умолчанию

Пепел Феникса, функции InterlockedAssign нет. Более того, даже lock mov сделать нельзя! Не потому ли, что такая операция по любому атомарна. Или предполагается, что такие данные должны всегда быть выровнены?

p51x, вот тут хотелось бы поподробнее, плиз
7in вне форума   Ответить с цитированием
Старый 19.09.2016, 14:10   #5
Пепел Феникса
Модератор
Заслуженный модератор
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 20,997
Репутация: 3402

icq: 446843180
skype: phoenix_proger
По умолчанию

Цитата:
функции InterlockedAssign нет.
InterlockedExchange возьмите, вы можете игнорировать старое значение.
(потому Assign и нету)
Цитата:
Или предполагается, что такие данные должны всегда быть выровнены?
вообще да.

lock префикс он для read-modify-write инструкций.
__________________
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума   Ответить с цитированием
Старый 19.09.2016, 14:11   #6
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 12,790
Репутация: 2126
По умолчанию

Ну, например, у армов есть конвеер. И вполне возможна ситуация, что, если не аккуратно сделать, то mov положит переменную на конвеер, а другой поток будет читать из памяти другое значение.
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума   Ответить с цитированием
Старый 19.09.2016, 14:47   #7
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,570
Репутация: 1777
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Ну, например, у армов есть конвеер. И вполне возможна ситуация, что, если не аккуратно сделать, то mov положит переменную на конвеер, а другой поток будет читать из памяти другое значение.
К атомарности это отношения не имеет.
Даже без всякого конвейра вы можете прочитать "старые" данные.
"Атомарность" в данном контексте означает, что не получится ситуация, когда mov в одном потоке изменил часть переменной а в другом потоке mov прочитал ее. Гарантируется, что считывается либо старое значение, либо новое. Другое дело, при каких условиях это гарантируется - для х86 для этого требуется, чтоб данные были выровнены. Собственно, об этом прямым текстом написано в мануалах по InterlockedXXX вызовам.
waleri вне форума   Ответить с цитированием
Старый 19.09.2016, 14:50   #8
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 12,790
Репутация: 2126
По умолчанию

Тогда причем тут lock из первого поста?
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума   Ответить с цитированием
Старый 19.09.2016, 14:51   #9
Pavia
Лис
Профессионал
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 1,614
Репутация: 1708
По умолчанию

Всё ниже моё гипотетическое, теоретическое предположение.
Нет не будет атомарной. Железо не обманешь. Оно вынуждено читать за 2 приема. А механизма защиты нет, по крайней мере интел пишет, что только выравненные на границе 4 байта. Хотя честно там так мутно это всё написано! майкрософт на 16 байт выравнивает мьютексы.
Цитата:
Более того, даже lock mov сделать нельзя!
Думаю что можно и он сработает. Но! Не на два участка памяти, а только на один. Поэтому для нас это бесполезно. Да и на разных машинах lock работает по разному.

Лично я для свой библиотеке сделал так. Мьютекс выравнен на границе 32 бит. В Delphi все 32 битные переменные так выровнены.
Для захвата использую.

Код:

lock  XCHG  DWord PTR [mutex],edx

А вот если хотите пропатчить код, то там данные не выровнены. Там либо использовать машинную команду cmpxchg8b (AtomicCompareExchange64) или медленный метод через средства ОС VirtualProtect(Addr, 5, PAGE_EXECUTE_READWRITE, OldProtect);.
__________________
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума   Ответить с цитированием
Старый 19.09.2016, 15:34   #10
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,570
Репутация: 1777
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Тогда причем тут lock из первого поста?
lock требуется для инструкций типа XCHG поскольку они выполняют и чтение и запись. Собственно lock можно выполнять с любой инструкцией, только смысла нет. lock посылает всем остальным процессорам сигнал "всем ждать, пока я закончу". Соотвественно lock инструкция блочится, пока остальные процы не скажут "мы ждем, о повелитель".
waleri вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объяснение. операторы присвоения.С valodu Помощь студентам 7 12.03.2016 05:54
перегрузка операции присвоения (С++) Sterben Помощь студентам 2 11.10.2015 22:01
Формула присвоения (дописывание текста из ячейки) SweetOpium Microsoft Office Excel 0 28.02.2013 15:53
алгоритм присвоения минимального значения max_scotch Помощь студентам 3 11.05.2012 19:25
последовательность присвоения значения переменным Maincore Общие вопросы Delphi 2 06.02.2012 13:10


00:37.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru