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

Вниз

Простенький вопрос по thread safe реализации   Найти похожие ветки 

 
Empleado ©   (2007-03-12 14:44) [0]

Раздирают сомнения.
Будет ли вот такая обертка TStringList"у потокобезопасной:
Вариант I.
TThreadSafeStringList = class
 private
   FStringList: TStringList;
   FLock: TCriticalSection;
 public
   ...
   function Add(const S: string): Integer;
 end;

function TThreadSafeStringList.Add(const S: string): Integer;
begin
 FLock.Enter;
 try
    Result := FStringList.Add(S)
 finally
    FLock.Leave
 end
end;


Вызов:
var MyList: TThreadSafeStringList;
   MyForm: TMyForm;

procedure TMyForm.MsgToLog(const Msg: string);
begin
 MyList.Add(Msg)
end;


Или же сначала надо получить Lock, а уже затем вызывать методы? Таким образом:
Вариант II.
TThreadSafeStringList = class
 private
   FStringList: TStringList;
   FLock: TCriticalSection;
 public
   ...
   function Add(const S: string): Integer;
   procedure LockList;
   procedure UnlockList;
 end;

Вызов:
procedure TMyForm.MsgToLog(const Msg: string);
begin
 MyList.LockList;
 try
    MyList.Add(Msg)
 finally
    MyList.UnlockList
 end
end;

Или же оба варианта имееют место быть?

Спасибо.
Всего доброго.


 
Сергей М. ©   (2007-03-12 14:53) [1]


> Или же оба варианта имееют место быть?


Или.
Все зависит от твоей фантазии.

По кр.мере, "фантазии" Борланда в части TThreadList сродни твоим для варианта с "или же"


 
Джо ©   (2007-03-12 15:13) [2]

Вариант II — ничем, кажется, не оправданная головная боль.


 
vl_chel ©   (2007-03-12 15:17) [3]

Самый простой способ использовать критические секции
Как уже упоминалось ранее см реализацию класса TThreadList
Если хочешь иметь потокобезопасный список строк напиши свой класс наследник отTStringList и переопредели методы, которые нуждаются в защите доступа из разных потоков


 
Empleado ©   (2007-03-12 16:00) [4]

Т.е., и в первом и во втором вариантах, у меня всегда есть гарантия, что при вызове функции Add(const S: string), например из трех-пяти разных потоков одновременно, const S будет добавлена в StringList всегда такой, как предусмотрено данным вызовом данного потока (имеется в виду момент до входа в критическую секцию в "Вариант I" в function Add(const S: string): Integer)?

Спасибо.


 
Сергей М. ©   (2007-03-12 16:03) [5]


> Empleado ©   (12.03.07 16:00) [4]


Да, концептуальной разницы между вариантами 1 и 2 нет.


 
Empleado ©   (2007-03-12 16:08) [6]

Большое спасибо всем.
Вопрос закрыт.



Страницы: 1 вся ветка

Текущий архив: 2007.05.06;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.019 c
11-1158926579
kichrot
2006-09-22 16:02
2007.05.06
Запрет перемещения разделителя в заголовке ListView


2-1176491891
Костя
2007-04-13 23:18
2007.05.06
Удаление файлов


15-1176242262
SerJaNT
2007-04-11 01:57
2007.05.06
Палитра компонентов Delphi


15-1176200510
Megabyte
2007-04-10 14:21
2007.05.06
ДАО программирования


11-1158934168
ter
2006-09-22 18:09
2007.05.06
Collapse