Форум: "Начинающим";
Текущий архив: 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