Пишите, пока несколько читателей читают из разных потоков в Rust - PullRequest
0 голосов
/ 11 июля 2020
• 1000 старая копия данных или новая, при условии, что память обновляется) Возможно ли это в безопасной (или небезопасной ржавчине)? объект, запись в который может занять много времени, но я хочу, чтобы читатели постоянно читали с него.

EDIT: В частности, у меня есть кэш, в котором хранятся различные объекты. Эти объекты просто содержат массив байтов (u8). Этот массив байтов необходимо читать из разных потоков, а также записывать в него (запись анализирует большую громоздкую структуру и преобразует различные поля в массив байтов).

1 Ответ

1 голос
/ 13 июля 2020

Это хороший вариант использования ящика arc-swap, который позволяет атомарно заменять один Arc другим. Каждый раз, когда вы используете sh для создания новой версии ваших данных, вы создаете клон данных и помещаете новую версию в Arc, заменяя старую Arc. Код, который необходимо прочитать, может получить клон Arc, который сейчас находится в ArcSwap, а старая версия будет уничтожена, как только больше не останется дескрипторов старой версии.

Если вам нужно изменить данных из нескольких мест, вы должны использовать следующий шаблон, используя Mutex.

  1. У вас есть дополнительная версия, используемая для обновлений, хранящихся внутри Mutex.
  2. Когда вы используете sh, чтобы обновить данные, заблокируйте мьютекс и внесите изменения.
  3. Создайте клон объекта, хранящегося в Mutex, и поместите его в ArcSwap.
  4. Затем разблокировать мьютекс.

Любой код, который хочет прочитать данные, возьмет клон из ArcSwap и никогда не будет касаться Mutex. Важно, чтобы мьютекс был разблокирован после замены Arc новой версией.

...