На самом деле не существует «функционального» способа иметь структуру данных, которая может обновляться несколькими потоками. Фактически, одна из причин того, что функциональное программирование так хорошо работает в многопоточной среде, заключается в том, что нет таких общих структур данных, как эта.
Однако в реальном мире эта проблема возникает постоянно, поэтому вам нужен какой-то способ сериализации доступа к общей структуре данных. Самый грубый способ - просто установить большую блокировку вокруг всего кода и разрешить запуск только одного потока одновременно (например, с Mutex). С продуманным дизайном это может быть сделано достаточно эффективным, но это может быть трудно сделать правильно и сложно поддерживать.
Более сложный подход состоит в том, чтобы иметь потокобезопасную очередь запросов к вашей структуре данных и один рабочий поток, который обрабатывает эти запросы один за другим. Одна из популярных платформ, поддерживающая эту модель, - Akka Actors. Вы оборачиваете свою структуру данных в Actor
, который затем получает запросы на чтение или изменение структуры данных. Платформа Akka гарантирует, что одновременно обрабатывается только одно сообщение.
В вашем случае ваш актер будет управлять кучей и получать обновления из потока, который попадет в кучу. Затем другие потоки могут отправлять запросы, которые будут обрабатываться последовательным потокобезопасным способом. Лучше всего, если эти запросы будут выполнять конкретные запросы в куче, а не просто каждый раз возвращать всю кучу.