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

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

CriticalSection [D7, XP]


Страницы:   1 2 3

Неважно ©   (2010-01-20 11:56:00) 

Один из потоков увеличивает(Inc) переменную. Второй уменьшает (Dec). А в третьем мне необходимо отдавать значение этой переменной.
С первым и вторым потоком все понятно :

EnterCriticalSection(CS);
Dec(FCountConnect); // или Inc
LeaveCriticalSection(CS);


Собственно, сам вопрос. А в третьем потоке я могу "отдать" значение этой переменной , например, так :

PostMessage(FMainHandle,WM_USER+99,wParam(FCountConnect),0);

Или нужно опять защищать ? Т.е. так :

EnterCriticalSection(CS);
PostMessage(FMainHandle,WM_USER+99,wParam(FCountConnect),0);
LeaveCriticalSection(CS);


Спасибо!


Sha   (2010-01-21 20:31:00) [21]

> Anatoly Podgoretsky ©   (21.01.10 20:21) [34]

InterlockedIncrement реализован через lock xadd


Anatoly Podgoretsky   (2010-01-21 20:21:00) [22]

> Sha  (21.01.2010 20:07:33)  [33]

В Дельфи InterlockedIncrement


Sha   (2010-01-21 20:07:00) [23]

или можно короче, если результат не важен:
lock inc


Игорь Шевченко   (2010-01-21 19:59:00) [24]

lock xadd :)


Anatoly Podgoretsky   (2010-01-21 19:56:00) [25]


> Если больше ничего не нужно от потока, то главное, чтобы
> исключения не было.

Нужно, нужно что бы работало правильно, а это похоже не атомарная инструкция. Нужно использовать Interlocked функции.


Sha   (2010-01-21 19:42:00) [26]

> Демо

> Если больше ничего не нужно от потока, то главное, чтобы исключения не было.
> Код выше не должен привести к исключению.

Вот код, который точно не приводит к исключению, проблема в том, что он не делает того, что нужно автору.
begin end;

> К тому же Inc и Dec с константой генерируются в одну машинную инструкцию..

 Ну и что.
 Процессор, выполняя ее, должен сначала прочитать значение из памяти, изменить его и затем поместить вычисленное значение в память. Между операциями чтения и записи возможен доступ к памяти со стороны других процессоров, которые также могут попытаться изменить это значение.
 В результате если один процессор инкрементирует в памяти значение 0, а другой декрементирует, мы можем получить любой результат: -1, 0, +1. Как фишка ляжет.


Демо   (2010-01-21 18:46:00) [27]

К тому же Inc и Dec с константой генерируются в одну машинную инструкцию...


Демо   (2010-01-21 18:43:00) [28]


> Sha ©   (21.01.10 16:23) [26]


Если больше ничего не нужно от потока, то главное, чтобы исключения не было.
Код выше не должен привести к исключению.


Anatoly Podgoretsky   (2010-01-21 17:03:00) [29]

$79 за дюйм.


Sha   (2010-01-21 16:23:00) [30]

> Anatoly Podgoretsky ©   (21.01.10 14:40) [24]
Согласен, возьму, если доплатит.

> Демо ©   (21.01.10 14:57) [25]
Не взлетит.


Демо   (2010-01-21 14:57:00) [31]

>Sha
inc(value)
dec(value)


Anatoly Podgoretsky   (2010-01-21 14:40:00) [32]

> Sha  (21.01.2010 13:31:23)  [23]

Такой код только за деньги.


Sha   (2010-01-21 13:31:00) [33]

> Демо ©   (21.01.10 12:18) [22]

???
Код давай, как увеличивать/уменьшать.


Демо   (2010-01-21 12:18:00) [34]


> Неважно   (20.01.10 11:56) 
> Один из потоков увеличивает(Inc) переменную. Второй уменьшает
> (Dec). А в третьем мне необходимо отдавать значение этой
> переменной.С первым и вторым потоком все понятно :EnterCriticalSection(CS);
> Dec(FCountConnect); // или IncLeaveCriticalSection(CS);


Если у тебя потоки только этим занимаеются - ничего защищать критическими секциями не нужно.


oxffff   (2010-01-20 14:17:00) [35]


> Sha ©   (20.01.10 13:07) [15]
> Для изменения проще использовать Interlocked-функции.
> Выровненные чтение и запись атомарны, поэтому на чтение
> защищать не надо.


Поддерживаю. Именно такие функции и нужно использовать(c lock префиксом).
Автору смотреть пример Synchronization and Multiprocessor Issues из MSDN.


Игорь Шевченко   (2010-01-20 13:48:00) [36]

Даже когда возможно исключение, выполнение в finally  LeaveCriticalSection в приводит к довольно трудно диагностируемым ошибкам


Anatoly Podgoretsky   (2010-01-20 13:40:00) [37]


> правильно - когда возможно исключение.

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


Anatoly Podgoretsky   (2010-01-20 13:38:00) [38]


> Читай справку.

О ИШ послали RTFM, вот только не по адресу.


Sha   (2010-01-20 13:18:00) [39]

> Атомарные в рамках одного процессора.  Адесли процессы выполняются на разных ядрах?

По барабану.


@!!ex   (2010-01-20 13:11:00) [40]

> [15] Sha ©   (20.01.10 13:07)

Атомарные в рамках одного процессора.  Адесли процессы выполняются на разных ядрах?


Страницы:   1 2 3

Наверх

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