Форум: "Основная";
Текущий архив: 2007.03.11;
Скачать: [xml.tar.bz2];
ВнизПотоки Найти похожие ветки
← →
Strate © (2007-01-17 16:34) [0]Здравствуйте Мастера. Такой вопрос:
Имеется два экземляра потока TThread
имеется процедура:
procedure TMyThread.Execute
begin
if {условие} then
DoTheTask;
end;
И процедура DoTheTask:
procedure DoTheTask;
begin
GlobalVar := GlobalVar+1;
end;
Для каждого экземпляра {условие} зависит от многих факторов и они независимы.
Но возможен вариант когда {условие} выполнится
← →
Strate © (2007-01-17 16:37) [1]Клиент проглючило :(
Ещё раз:
процедура
procedure TMyThread.Execute
begin
while true do
if {условие} then
DoTheTask;
end;
procedure DoTheTask;
begin
GlobalVar := GlobalVar+1;
end;
Условие зависит от многих факторов и в каждый момент времени разное.
Но возможео вариант что в один момент времени {условие} для обоих потоков станет = true.
В каком порядке выполнится DoTheTask? И что будет с GlobalVar? Не возникнет ли ошибки? И как правильнее это обработать?
← →
evvcom © (2007-01-17 16:42) [2]> В каком порядке выполнится DoTheTask?
После if {условие}
> что будет с GlobalVar
Ее значение, возможно, увеличится.
> Не возникнет ли ошибки
Какой? Ошибки рантайм от этого точно не будет. А вот логическая имеется.
> И как правильнее это обработать?
Синхронизировать потоки, например, с помощью критических секций.
← →
Strate © (2007-01-17 16:46) [3]Забыл пояснить что для каждого потока уловие не одно и то же, а разное. Т.е. в большинстве случаев для одного потока будет true, а для второго false. И наоборот. Либо оба в false. Варииант в с двумя true имеет очень малую вероятность возникновения.
← →
Strate © (2007-01-17 16:48) [4]evvcom © (17.01.07 16:42) [2]
> В каком порядке выполнится DoTheTask?
После if {условие}
Ну это понятно, но по идее оно 2 раза должно увеличится.
> Синхронизировать потоки, например, с помощью критических секций.
А можно попродробнее?
← →
evvcom © (2007-01-17 16:58) [5]> [4] Strate © (17.01.07 16:48)
> А можно попродробнее?
Про это можно книгу написать. И уже много написано. Недавно здесь выкладывали ссылку на Джефри Рихтера "Windows для профессионалов", поищи, почитай. Если с английским все в порядке, можешь и в хелпе win32.hlp это поискать. См. CriticalSection.
← →
Сергей М. © (2007-01-17 17:04) [6]
> В каком порядке выполнится DoTheTask?
"Кто первый встал, того и тапки" (С) Н.Фоменко, aka "лохматое чудовище"
← →
гостъ (2007-01-17 17:15) [7]
> В каком порядке выполнится DoTheTask?
В том порядке, в котором на данный момент времени, какой поток выполнялся. Т.е. однозначного ответа нет.
--------------
Класс TCriticalSection - unit SyncObjs
Примеры работы в Classes, правда Борланд там, как всегда пользуется Виндовыми средствами, а именно структурой RTLCriticalSection, дельфиный класс это обертка над ней, но тем не менее... Как раз синхронизация потоков, при обращении к VCL WinControl-ам, использует критическую секцию.
var
g_csGlobalVar : TCriticalSection;
procedure DoTheTask;
begin
g_csGlobalVar.Enter;
GlobalVar := GlobalVar+1;
g_csGlobalVar.Leave;
end;
initialization
g_csGlobalVar := TCriticalSection.Create;
finalization
g_csGlobalVar.Free;
← →
evvcom © (2007-01-17 17:21) [8]> [7] гостъ (17.01.07 17:15)
> Примеры работы в Classes, правда
Ему бы лучше книжки почитать, примеры разобрать, а так сейчас скопирует опять бездумно в свой проект, и посыпятся опять вопросы "почему".
← →
гостъ (2007-01-17 17:35) [9]Хммм... ну советы про Рихтера уже были... ;)
тем более, что я ссылаюсь на код из Дельфи - Classes.
← →
evvcom © (2007-01-18 08:35) [10]> [9] гостъ (17.01.07 17:35)
> тем более, что я ссылаюсь на код из Дельфи - Classes
И что? Если код из Classes, то уже и не под виндой работаешь? Принципы-то все равно виндовые остаются, в Classes ничего сверхестественного не написано.
← →
icWasya © (2007-01-18 09:35) [11]есть еще InterlockedIncrement / InterlockedDecrement
← →
evvcom © (2007-01-18 09:43) [12]> [11] icWasya © (18.01.07 09:35)
Ну если только +-1, то да с некоторыми ограничениями.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.03.11;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.042 c