TCriticalSection со многими читателями и одним писателем - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть сервисное приложение, написанное на Delphi 10 Seattle Win32, в котором есть данные в памяти, которые регулярно обновляются в потоке.

Поскольку данные представляют собой сложную структуру и принимаются в виде кусков, код обновления записывает во временный список, а когда он завершает структуру, переключает этот временный список в «производственный» список, который читается многими потоками читателей.

Я считал код «переключателя» критическим разделом вместе с соответствующими читателями, чтобы они взаимно исключались. Позже я понял, что в качестве побочного эффекта потоки читателя также являются взаимоисключающими.

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

Кроме того, я защитил только код считывателя, который собирает данные, которые он должен отправить, и делает копии этих данных для отправки после выхода из критического раздела. Интересно, должно ли быть более производительным, чтобы этот код сбора данных в любом случае был взаимоисключающим или сериализованным.

Заранее спасибо.

1 Ответ

0 голосов
/ 06 ноября 2018

В SysUtils есть TMultiReadExclusiveWriteSynchronizer . (Если вам нравятся ваши пальцы, попробуйте использовать псевдоним TMREWSync из того же устройства.)

Имейте в виду, однако, что это ужасно медленно и что во многих случаях простой критический раздел будет работать лучше.

При компиляции для Windows вы можете также рассмотреть возможность использования Slim Reader / Writer . Это специфично для Windows, но очень быстро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...