Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Для изменения boolean в мультипотокс нужны атомарные операции?


sanx ©   (2009-08-29 02:54:00) 

Думаю что разные lock... команды лишние, все равно ведь нужен или 0 или не ноль. Так ли это?


Anatoly Podgoretsky   (2009-08-29 16:05:00) [1]

> DrPass  (29.08.2009 14:03:15)  [15]

Не про булевский тип мы говорим, ты видимо выпал из контексту, "выравненый на границу двойного слова".


Sha   (2009-08-29 14:09:00) [2]

> sanx   (29.08.09 13:40) [14]
> компилятор хранит boolean в 4 байтах, хотя вроде в 1-ом должен,

хранит в одном


DrPass   (2009-08-29 14:03:00) [3]


> Anatoly Podgoretsky ©   (29.08.09 10:36) [5]
>
> И для 386SX это справедливо тоже?

У нормальных пользователей 386SX булевский тип был 16-битным :)


sanx   (2009-08-29 13:40:00) [4]

Спс за ответы :) Да я просто уже задолбался эту синхронизацию делать, а тут флаг один понадобился. По сути его устанавливает или сбрасывает пользователь. Потоки же просто читают его значение. Думаю что если какой-то поток не успеет впоймать изменение, то ничего страшного :) Даже если нужно выравнивание и компилятор хранит boolean в 4 байтах, хотя вроде в 1-ом должен, то все равно важен один лишь младший байт. Причем идет запись константы, и не каких арифметических операций. Значит должно все быть нормально :)


Sha   (2009-08-29 13:01:00) [5]

> Anatoly Podgoretsky ©   (29.08.09 12:47) [12]
> Я предполагаю, что не является

Скорее всего


Anatoly Podgoretsky   (2009-08-29 12:47:00) [6]

> Sha  (29.08.2009 12:40:11)  [11]

Я предполагаю, что не является, а в руководстве ни слова, потому что в то время никто не заморачивался подобным.
Хотя если судить по прерываниям, то гарантируется выполнение команды до конца, кажется кроме случаев аггрегатных комманд, например с префиксом REP


Sha   (2009-08-29 12:40:00) [7]

> Anatoly Podgoretsky ©   (29.08.09 12:31) [9]

В мануале по 386 на этот счет нет ни слова
http://microsym.com/editor/assets/386intel.pdf


Sha   (2009-08-29 12:35:00) [8]

Думаю, автор топика понимает, что
не всякое атомарное присваивание значения переменной в одном потоке станет тут же заметно в других потоках.


Anatoly Podgoretsky   (2009-08-29 12:31:00) [9]

> Sha  (29.08.2009 10:59:07)  [7]

> там же шина 16 бит.

Вот поэтому и спрашиваю.


Sha   (2009-08-29 11:05:00) [10]

> DVM ©   (29.08.09 10:58) [6]
> Может лучше не искушать судьбу и всегда делать синхронизацию доступа.

Автор ведет речь только об атомарном присваивании значения булевской переменной.
О синхронном доступе к памяти речи пока нет, на что я ему намекнул в [3].


Sha   (2009-08-29 10:59:00) [11]

Том 3А от Интел, п 8.1.1, "Гарантированно атомарные операции"
описывает поведение процессоров, начиная с 486.

Насколько помню, с атомарностью у 386 и 486 все одинаково.
Насчет SX не уверен, там же шина 16 бит.


DVM   (2009-08-29 10:58:00) [12]


> > Для изменения boolean в мультипотокс нужны атомарные операции?
>
>
> Нет, не требуется.
>

Может лучше не искушать судьбу и всегда делать синхронизацию доступа.


Anatoly Podgoretsky   (2009-08-29 10:36:00) [13]

> Sha  (29.08.2009 10:32:04)  [4]

И для 386SX это справедливо тоже?


Sha   (2009-08-29 10:32:00) [14]

Замечание.

[3] верно для всех процессоров, начиная с Pentium.

Для младших моделей (386 и 486) операции атомарны
только в случае выравнивания на соответствующую границу.


Sha   (2009-08-29 10:19:00) [15]

> Для изменения boolean в мультипотокс нужны атомарные операции?

Нет, не требуется.

В IA-32 запись или чтение байта/слова/двойного слова,
не выходящие за границы выровненного двойного слова,
всегда атомарны.

Обычно надо не только атомарно установить значение переменной  в памяти,
а сделать еще что-то. Вот как раз с этим и могут быть проблемы :)


sanx   (2009-08-29 03:56:00) [16]

DrPass, спс, ответ по существу. Да, я имел ввиду просто операцию по изменению, которые болжны по идее откомпилироватся в mov *, 0 или mov *,\x8 not 0. Конечно если пытаться изменять false/true не простым присвоением а командами типа dec/inc/add то да, тут могут быть сложности :)


DrPass   (2009-08-29 03:08:00) [17]

В типичном случае изменение булевой переменной - атомарная операция, и в синхронизации не нуждается. А так, мало ли какую логику ты там дальше наворачиваешь...


Наверх

Титульная страница Поиск, карта сайта Написать письмо