![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
CriticalSection [D7, XP]
Неважно © (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)
Атомарные в рамках одного процессора. Адесли процессы выполняются на разных ядрах?