Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.03.21;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.004 c
4-1217942070
Rafa
2008-08-05 17:14
2010.03.21
Программирование устройства через COM-port


15-1262029116
Kerk
2009-12-28 22:38
2010.03.21
Как такое можно технически объяснить?


3-1236248430
WeTeR
2009-03-05 13:20
2010.03.21
Процедура для определения типа столбца таблицы


15-1262453629
Оно-16
2010-01-02 20:33
2010.03.21
Удаленный помощник удали троян


15-1262056626
товарищ икс
2009-12-29 06:17
2010.03.21
Младший бит на php





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский