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

StackOverflow https://stackoverflow.com/questions/302583

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

Другие советы

Посмотрите этот урок.Использование потоков в духе Delphi

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

Вам действительно стоит посмотреть TThreadList.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top