Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.03.21;
Скачать: CL | DM;

Вниз

CriticalSection   Найти похожие ветки 

 
Неважно   (2010-01-20 11:56) [0]

Один из потоков увеличивает(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);


Спасибо!


 
@!!ex ©   (2010-01-20 12:10) [1]

Нужно защищать.


 
Ega23 ©   (2010-01-20 12:14) [2]


> Нужно защищать.


На чтение - не нужно.


 
Игорь Шевченко ©   (2010-01-20 12:17) [3]


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


Так не нужно


 
Б   (2010-01-20 12:17) [4]

Защищать нужно ОБЯЗАТЕЛЬНО в блоках: try..finally.



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



 
Игорь Шевченко ©   (2010-01-20 12:18) [5]

Б   (20.01.10 12:17) [4]

У тебя времени дофига и пальцы стальные ? Ну так не учи других неправильному


 
@!!ex ©   (2010-01-20 12:19) [6]

> [2] Ega23 ©   (20.01.10 12:14)

Другой процесс во время чтения может изменить данные.
Если однопроцессорная система, то пофиг, т.к. операция атомарная(если не ошибаюсь).
Но на многопроцессорных системах данные могут поломаться.
Или я не прав?


 
Б   (2010-01-20 12:20) [7]


> У тебя времени дофига и пальцы стальные ? Ну так не учи
> других неправильному


Какого фига, это не правильно?


 
Игорь Шевченко ©   (2010-01-20 12:23) [8]

Б   (20.01.10 12:20) [7]

Религиозный фанатизм и бездумное написание кода в программировании не уместны.


 
Б   (2010-01-20 12:26) [9]


> Игорь Шевченко ©   (20.01.10 12:23) [8]


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


 
Ega23 ©   (2010-01-20 12:27) [10]


> Какого фига, это не правильно?


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


 
Б   (2010-01-20 12:30) [11]


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


Я написал в целом.


 
Игорь Шевченко ©   (2010-01-20 12:34) [12]

Б   (20.01.10 12:26) [9]

Какое именно место в справке надо читать ?


 
Игорь Шевченко ©   (2010-01-20 12:39) [13]

Ega23 ©   (20.01.10 12:27) [10]

Ты развивай свою мысль дальше, случилось исключение, дальше что ?


 
Неважно   (2010-01-20 12:57) [14]

Спасибо. Что-то тут "шум" возник. Одни говорят не нужно, вторые нужно.
Весело ))

В общем, на чтение защищать не буду.


> Защищать нужно ОБЯЗАТЕЛЬНО в блоках: try..finally.


А какое возможно исключение в коде Inc(FCountConnect) ?


 
Sha ©   (2010-01-20 13:07) [15]

Для изменения проще использовать Interlocked-функции.
Выровненные чтение и запись атомарны, поэтому на чтение защищать не надо.


 
@!!ex ©   (2010-01-20 13:11) [16]

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

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


 
Sha ©   (2010-01-20 13:18) [17]

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

По барабану.


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


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

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


 
Anatoly Podgoretsky ©   (2010-01-20 13:40) [19]


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

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


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

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


 
oxffff ©   (2010-01-20 14:17) [21]


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


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


 
Демо ©   (2010-01-21 12:18) [22]


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


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


 
Sha ©   (2010-01-21 13:31) [23]

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

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


 
Anatoly Podgoretsky ©   (2010-01-21 14:40) [24]

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

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


 
Демо ©   (2010-01-21 14:57) [25]

>Sha
inc(value)
dec(value)


 
Sha ©   (2010-01-21 16:23) [26]

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

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


 
Anatoly Podgoretsky ©   (2010-01-21 17:03) [27]

$79 за дюйм.


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


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


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


 
Демо ©   (2010-01-21 18:46) [29]

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


 
Sha ©   (2010-01-21 19:42) [30]

> Демо

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

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

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

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


 
Anatoly Podgoretsky ©   (2010-01-21 19:56) [31]


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

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


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

lock xadd :)


 
Sha ©   (2010-01-21 20:07) [33]

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


 
Anatoly Podgoretsky ©   (2010-01-21 20:21) [34]

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

В Дельфи InterlockedIncrement


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

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

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


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

Удалено модератором


 
Anatoly Podgoretsky ©   (2010-01-21 20:41) [37]

> Sha  (21.01.2010 20:31:35)  [35]

Это ассемблерная команда, и нафига тогда ее включать, тем более, что InterlockedIncrement реализован через lock xadd


 
Sha ©   (2010-01-21 21:13) [38]

> Anatoly Podgoretsky ©   (21.01.10 20:41) [37]

Ну, например, lock inc очень часто используется в строковых функция Delphi RTL.


 
Демо ©   (2010-01-21 21:49) [39]


> выполняя ее, должен сначала прочитать значение из памяти,
>  изменить его и затем поместить вычисленное значение в память.
>


Разве так?


 
Sha ©   (2010-01-21 21:52) [40]

> Демо ©   (21.01.10 21:49) [39]

Ага.



Страницы: 1 2 вся ветка

Текущий архив: 2010.03.21;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.008 c
2-1263635338
OOO_leg
2010-01-16 12:48
2010.03.21
Компоненты


1-1234778692
SPeller
2009-02-16 13:04
2010.03.21
Можно ли WideString спокойно использовать вместо String?


15-1262175997
Ega23
2009-12-30 15:26
2010.03.21
С наступающим, товарищи!


2-1263667987
Inna21
2010-01-16 21:53
2010.03.21
DBASE


2-1263898004
виктор
2010-01-19 13:46
2010.03.21
Как изменить свойство группы компонентов?