![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы
![]() |
Поиск в этой теме
![]() |
![]() |
#1 |
(aka Jin X) !RTFM!
Форумчанин
Регистрация: 14.12.2014
Сообщений: 296
|
![]()
У меня тут вопрос возник: будет ли обычное 32-битное присвоение (mov [X],eax), если переменная не выровнена по границе памяти, атомарным? Т.е. переменная 32-битная находится, скажем, по адресу 00FFFFFFh. Причём, прикол в том, что за-lock-ить её нельзя.
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
|
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
не факт.
не спроста есть целое семейство Interlocked* функций. https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,828
|
![]()
Еще и от проца зависит...
|
![]() |
![]() |
![]() |
#4 |
(aka Jin X) !RTFM!
Форумчанин
Регистрация: 14.12.2014
Сообщений: 296
|
![]()
Пепел Феникса, функции InterlockedAssign нет. Более того, даже lock mov сделать нельзя! Не потому ли, что такая операция по любому атомарна. Или предполагается, что такие данные должны всегда быть выровнены?
p51x, вот тут хотелось бы поподробнее, плиз ![]()
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
|
![]() |
![]() |
![]() |
#5 | ||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]() Цитата:
(потому Assign и нету) Цитата:
lock префикс он для read-modify-write инструкций. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
||
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,828
|
![]()
Ну, например, у армов есть конвеер. И вполне возможна ситуация, что, если не аккуратно сделать, то mov положит переменную на конвеер, а другой поток будет читать из памяти другое значение.
|
![]() |
![]() |
![]() |
#7 | |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,370
|
![]() Цитата:
Даже без всякого конвейра вы можете прочитать "старые" данные. "Атомарность" в данном контексте означает, что не получится ситуация, когда mov в одном потоке изменил часть переменной а в другом потоке mov прочитал ее. Гарантируется, что считывается либо старое значение, либо новое. Другое дело, при каких условиях это гарантируется - для х86 для этого требуется, чтоб данные были выровнены. Собственно, об этом прямым текстом написано в мануалах по InterlockedXXX вызовам. |
|
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,828
|
![]()
Тогда причем тут lock из первого поста?
|
![]() |
![]() |
![]() |
#9 | |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
![]()
Всё ниже моё гипотетическое, теоретическое предположение.
Нет не будет атомарной. Железо не обманешь. Оно вынуждено читать за 2 приема. А механизма защиты нет, по крайней мере интел пишет, что только выравненные на границе 4 байта. Хотя честно там так мутно это всё написано! майкрософт на 16 байт выравнивает мьютексы. Цитата:
Лично я для свой библиотеке сделал так. Мьютекс выравнен на границе 32 бит. В Delphi все 32 битные переменные так выровнены. Для захвата использую. Код:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
|
![]() |
![]() |
![]() |
#10 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,370
|
![]()
lock требуется для инструкций типа XCHG поскольку они выполняют и чтение и запись. Собственно lock можно выполнять с любой инструкцией, только смысла нет. lock посылает всем остальным процессорам сигнал "всем ждать, пока я закончу". Соотвественно lock инструкция блочится, пока остальные процы не скажут "мы ждем, о повелитель".
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Объяснение. операторы присвоения.С | valodu | Помощь студентам | 7 | 12.03.2016 04:54 |
перегрузка операции присвоения (С++) | Sterben | Помощь студентам | 2 | 11.10.2015 21: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 |