Страницы

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

воскресенье, 2 февраля 2020 г.

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

#cpp #cpp11


Один поток пишет в структуру, другие потоки читают. Требуется обеспечить транзакционность
записи (т.е. чтобы при обновлении двух полей, потоки чтения не могли получить возможность
прочитать наполовину обновленные данные).
В идеале для чтения иметь метод 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;
}


Возможно есть лучшее решение, подскажите в какую строну копать.
    


Ответы

Ответ 1



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

Ответ 2



Если ваша структура тривиально копируема, оберните ее в std::atomic<> Каждая специализация шаблона std::atomic определяет атомарный тип. Только объекты атомарных С++ типов могут безопасно использоваться в нескольких потоках одновременно. Когда один поток сохраняет данные в объекте атомарного типа, а другой хочет их прочитать, поведение программы определено стандартом. #include //......... struct Foo { int alpha; char* beta; }; using AFoo=std::atomic;

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

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