![]() |
| ||
|
|
Новости |
Поиск |
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-20 13:07:00) [41]Для изменения проще использовать Interlocked-функции.
Выровненные чтение и запись атомарны, поэтому на чтение защищать не надо.
Неважно (2010-01-20 12:57:00) [42]Спасибо. Что-то тут "шум" возник. Одни говорят не нужно, вторые нужно.
Весело ))
В общем, на чтение защищать не буду.
> Защищать нужно ОБЯЗАТЕЛЬНО в блоках: try..finally.
А какое возможно исключение в коде Inc(FCountConnect) ?
Игорь Шевченко (2010-01-20 12:39:00) [43]Ega23 © (20.01.10 12:27) [10]
Ты развивай свою мысль дальше, случилось исключение, дальше что ?
Игорь Шевченко (2010-01-20 12:34:00) [44]Б (20.01.10 12:26) [9]
Какое именно место в справке надо читать ?
Б (2010-01-20 12:30:00) [45]
> правильно - когда возможно исключение.
Я написал в целом.
Ega23 (2010-01-20 12:27:00) [46]
> Какого фига, это не правильно?
правильно - когда возможно исключение.
Б (2010-01-20 12:26:00) [47]
> Игорь Шевченко © (20.01.10 12:23) [8]
Читай справку.
Игорь Шевченко (2010-01-20 12:23:00) [48]Б (20.01.10 12:20) [7]
Религиозный фанатизм и бездумное написание кода в программировании не уместны.
Б (2010-01-20 12:20:00) [49]
> У тебя времени дофига и пальцы стальные ? Ну так не учи
> других неправильному
Какого фига, это не правильно?
@!!ex (2010-01-20 12:19:00) [50]> [2] Ega23 © (20.01.10 12:14)
Другой процесс во время чтения может изменить данные.
Если однопроцессорная система, то пофиг, т.к. операция атомарная(если не ошибаюсь).
Но на многопроцессорных системах данные могут поломаться.
Или я не прав?
Игорь Шевченко (2010-01-20 12:18:00) [51]Б (20.01.10 12:17) [4]
У тебя времени дофига и пальцы стальные ? Ну так не учи других неправильному
Б (2010-01-20 12:17:00) [52]Защищать нужно ОБЯЗАТЕЛЬНО в блоках: try..finally.
EnterCriticalSection(CS);
Try
Dec(FCountConnect); // или Inc
Finally
LeaveCriticalSection(CS);
end;
Игорь Шевченко (2010-01-20 12:17:00) [53]
>
> EnterCriticalSection(CS);
> PostMessage(FMainHandle,WM_USER+99,wParam(FCountConnect),
> 0);
> LeaveCriticalSection(CS);
Так не нужно
Ega23 (2010-01-20 12:14:00) [54]
> Нужно защищать.
На чтение - не нужно.
@!!ex (2010-01-20 12:10:00) [55]Нужно защищать.