Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Класс TTHread [D5, Win2k]


Fktrc ©   (2004-10-14 06:13:00) 

Есть класс потока.
TItemThread = class(TThread)
Таких потоков куча и каждый привязан к элементу ListView

Правильно ли я понимаю, что обращаться к public полям класса TItemThread из главного потока приложения можно без синхронизации, если в потоке TItemThread к этим полям обращений нет?


panov   (2004-10-14 13:12:00) [1]

Тем более, на компьютерах с несколькими процессорами.


panov   (2004-10-14 13:09:00) [2]

>KSergey ©   (14.10.04 12:44) [12]

Сразу поясню свою мысль:
заранее неизветсно, на каких процессорах будет испольняться код, и как будет определен тип integer, поэтому не факт, что даже присвоение (RC=18, например), будет являться атомарной операцией.


panov   (2004-10-14 13:06:00) [3]

>KSergey ©   (14.10.04 12:44) [12]

Да. Integer тоже надо защищать.


KSergey   (2004-10-14 12:44:00) [4]

> [8] panov ©   (14.10.04 10:30)

Защита при доступе к Integer?? Или просто для примера?


TUser   (2004-10-14 12:08:00) [5]

А в чем тогда смысл критических секций? Они разве не делают код безопасным?


panov   (2004-10-14 10:57:00) [6]

да, небезопасный код нужно защищать везде при использовании в разных потоках.


TUser   (2004-10-14 10:55:00) [7]


> Синхронизировать надо доступ к любымобъектам

Я правильно понял - даже если я напишу свой (не VCL) класс, и использую там везде, где можно CriticalSection, то доступ к объектам этого класса тоже надо синхронизировать? Тогда непонятно - почему так, вроде бы таким образом гарантируется потоко-безопасность?.
Аналогично - к TThreadList'у вроде бы можно обратиться без синхронизации (именно потому, что он защищен критическими секциями, и два потока не могут его одновременно заюзать), так?


panov   (2004-10-14 10:30:00) [8]

PS.
Пример:

TTest=class(TThread)
protected
  procedure Execute;override;
public
  FValue: Integer;  
end;

ptocedure TTest.Execute;
var
  Counter: Integer;
begin
 ...
 FValue := Counter;
 ...  
end;

Если Test - экземпляр класса TTest, и обращение к FValue производится таким образом MyValue := Test.FValue, то такой код необходимо защищищать например, критическими секциями:


TTest=class(TThread)
private
  FCS: RTL_CRITICAL_SECTION;
  FValue: Integer;  
  finction  GetValue: Integer;
  procedure SetValue(Value: Integer);
  procedure Lock;
  procedure Unlock;
protected
  procedure Execute;override;
public
  constructor Create;
  destructor Destroy; override;
  property Value: Integr read GetValue write SetValue;
end;

constructor TTest.Create;
begin
 inherited Create(True);
 InitializeCriticalSection(FCS);
 Resume;
end;

destructor TTest.Destroy;
begin
  DeleteCriticalSection(FCS);
end;

procedure TTest.Lock;
begin
  EnterCriticalSection(FCS);
end;

procedure TTest.Unlock;
begin
  LeaveCriticalSection(FCS);
end;

function TTest.GetValue: Integer;
begin
  Lock;
  try
    Result := FValue;
  finally
    Unlock;
  end;
end;

procedure TTest.SetValue(Value: Integer);
begin
  Lock;
  try
    FValue := Value;
  finally
    Unlock;
  end;
end;

ptocedure TTest.Execute;
var
  Counter: Integer;
begin
 ...
 FValue := Counter;
 ...  
end;


panov   (2004-10-14 10:18:00) [9]

>Fktrc ©
В случае, если обращение к полям происходит тольков одном потоке(неважно, основной это поток или дочерний), в синхронизации нет нужды.

>TUser ©   (14.10.04 07:22) [3]

Можно. Синхронизировать надо обращение к VCL из не-основного потока, а к полям класса ты можешь обратиться, как к полям класса.


Синхронизировать надо доступ к любымобъектам, если обращение к ним происходит из разных потоков, неважно VCL это или не VCL, в основном или дочернем потоке.


Fktrc   (2004-10-14 08:36:00) [10]

Спасибо


TUser   (2004-10-14 07:31:00) [11]

Из 2200, кажется. Я бы и 10-15 лишних потоков не делал. Если они делают что-то простое, то нетрудно это совместить в один поток. А если сложное - то один фиг надо искать кластер. Кстати, все сложные программы (такого уровня, как Word, Delphi ect) обходятся несколькими потоками (иногда несколькими процессами с одним или несколькими потоками в каждом).


TUser   (2004-10-14 07:22:00) [12]

Можно. Синхронизировать надо обращение к VCL из не-основного потока, а к полям класса ты можешь обратиться, как к полям класса.


Sun bittern   (2004-10-14 07:22:00) [13]

TUser ©   (14.10.04 07:00) [1]

Это смотря сколько много. Полмнится когда то ветка была про нейросеть из не одной тысячи потоков :)

А по сабжу, если написанное действительно так, то можно и без синхронизации.


Fktrc   (2004-10-14 07:18:00) [14]

Ну пусть даже не надо, но это уже вопрос архитектуры приложения.

А меня интересует следующий узкоспециальный вопрос - можно ли обращаться к public-полям объекта класса TThread из главного потока без синхронизации с вторичным при условии, что вторичный к этим полям не обращается?


TUser   (2004-10-14 07:00:00) [15]

А действительно надо к каждомуитему свой поток вешать. Их ведь много получается.


Наверх

Титульная страница Поиск, карта сайта Написать письмо