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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.029 c
15-1171602255
Думкин
2007-02-16 08:04
2007.03.11
Как надо сдавать зачеты. :)


15-1171465263
Ученик чародея
2007-02-14 18:01
2007.03.11
JavaScript


2-1171787064
Lamer666
2007-02-18 11:24
2007.03.11
DbGridEh ImageList


1-1168612263
Cara
2007-01-12 17:31
2007.03.11
Сложная форма


4-1162392223
TDima
2006-11-01 17:43
2007.03.11
Окно на задний план