Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.04 c
15-1176018916
Йцукен
2007-04-08 11:55
2007.05.06
схождение Благодатного Огня


2-1176626953
ppcumax
2007-04-15 12:49
2007.05.06
Как создать динамические переменные?


15-1175965637
GeLLeR
2007-04-07 21:07
2007.05.06
Вопрос про Висту


2-1176739579
likenoother
2007-04-16 20:06
2007.05.06
проблема с точкой и запятой


2-1176446453
Бульбаш
2007-04-13 10:40
2007.05.06
Проблема с запуском софта





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский