Форум: "Основная";
Текущий архив: 2007.05.06;
Скачать: [xml.tar.bz2];
ВнизПростенький вопрос по 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.047 c