Страницы

Поиск по вопросам

пятница, 5 апреля 2019 г.

Многопоточный доступ к данным

Один поток пишет в структуру, другие потоки читают. Требуется обеспечить транзакционность записи (т.е. чтобы при обновлении двух полей, потоки чтения не могли получить возможность прочитать наполовину обновленные данные). В идеале для чтения иметь метод const Foo& get() const;
В текущей реализации используется подход с мьютексами и хранением отдельных для каждого потока копий в std::map.
void ConfigUpdater::set(const Config& config) { MutexGuard mutexGuard(mutex); this->config = config; }
const Config& ConfigUpdater::get() const { MutexGuard mutexGuard(mutex); return copies.emplace(boost::this_thread::get_id(), config).first->second; }
Возможно есть лучшее решение, подскажите в какую строну копать.


Ответ

Можно воспользоваться std::shared_lock для чтения и std::unique_lock для записи, это позволить избежать копирования. std::shared_timed_mutex доступен в C++14, в C++17 есть std::shared_mutex

Комментариев нет:

Отправить комментарий