Как я могу реализовать потокобезопасную оболочку списка в Delphi? - PullRequest
6 голосов
/ 19 ноября 2008

У меня есть оболочка списка, которая поддерживает два Tstringlist и TClassList

Мне нужно, чтобы это был потокобезопасный, такой что:

  • Одновременные записи запрещены (необходимо ввести какое-то состояние ожидания)
  • Чтение во время записи (или наоборот) недопустимо (необходимо ввести какое-то состояние ожидания)
  • Одновременные чтения разрешены

Есть идеи, как мне это сделать? Мой инстинкт подсказывает мне, что ему нужно больше, чем просто критический раздел, возможно, семафор или «счетчик использования», возможно, один из них в в сочетании с CS.

Я просто не совсем уверен, с чего начать - очень хотелось бы получить что-либо от общего подхода на английском языке к псевдо-коду, реализации delphi или внешней ссылки.

Ответы [ 3 ]

12 голосов
/ 19 ноября 2008

Вы должны взглянуть на класс TMultiReadExclusiveWriteSynchronizer, объявленный в sysutils.pas ...

5 голосов
/ 19 ноября 2008

Взгляните на этот урок. Пронизывание Дельфийского Пути

Посмотрите на Главу 11, но это все хорошо.

2 голосов
/ 01 декабря 2008

Вы действительно должны взглянуть на TThreadList.

Методы .Add, .Remove, .Clear автоматически блокируют список для вас. При необходимости вы также можете заблокировать / разблокировать при необходимости:

x.LockList; 
try 
  //do whatever
finally  
  x.Unlocklist; 
end;

TMultiReadExclusiveWriteSynchronizer - отличная идея, но я не знаю, устраняли ли они когда-нибудь все ошибки. У него всегда были проблемы под нагрузкой.

...