Как я могу реализовать потокобезопасную оболочку списка в Delphi?
-
08-07-2019 - |
Вопрос
У меня есть оболочка списка, которая поддерживает два списка Tstringlist и TClassList.
Мне нужно, чтобы это было потокобезопасным, например:
- Одновременная запись не разрешена (должно быть введено какое-то состояние ожидания)
- Чтение во время записи (или наоборот) не разрешено (должно быть введено какое-то состояние ожидания)
- Параллельное чтение являются допустимый
Есть идеи, как я могу это сделать?Мой инстинкт подсказывает мне, что нужно нечто большее, чем просто критическая секция, возможно, семафор или «счетчик использования», возможно, один из них в соединение с КС.
Я просто не совсем уверен, с чего начать - мы будем очень признательны за что-либо, от общего подхода на английском языке до псевдокода, реализации Delphi или внешней ссылки.
Решение
Вам следует взглянуть на класс TMultiReadExclusiveWriteSynchronizer, объявленный в sysutils.pas...
Другие советы
Посмотрите этот урок.Использование потоков в духе Delphi
Посмотрите главу 11, там все хорошо.
Вам действительно стоит посмотреть TThreadList.
Методы .Add, .Remove, .Clear автоматически блокируют список.При необходимости вы также можете заблокировать/разблокировать по мере необходимости:
x.LockList;
try
//do whatever
finally
x.Unlocklist;
end;
TMultiReadExclusiveWriteSynchronizer — отличная идея, но я не знаю, исправили ли они когда-нибудь все ошибки.Всегда были проблемы под нагрузкой.