Использование мьютекса в сочетании с shared_ptr для защиты данных, разделяемых между копиями - PullRequest
0 голосов
/ 21 апреля 2019

У меня есть класс, копии которого разделяют те же данные через shared_ptr. Поскольку эти данные будут модифицироваться различными потоками, я буду использовать мьютекс для его защиты, однако, насколько я понимаю, объект мьютекса должен быть одинаковым для разных копий, чтобы работать, игнорируя тот факт, что мьютексы на самом деле не копируются.

Поэтому я намерен также включить мьютекс в shared_ptr. Вот так:

#pragma once

#include <mutex>
#include <memory>
#include <vector>

class test {
public:
  auto some_action(int x) -> void {
    std::scoped_lock(*m_store_mutex);

    m_shared_store->push_back(x);
  }

private:
  std::shared_ptr<std::mutex> m_store_mutex { std::make_shared<std::mutex>() };
  std::shared_ptr<std::vector<int>> m_shared_store { std::make_shared<std::vector<int>>() };
};

Является ли этот подход действительным? Вроде бы работает, но хотелось бы быть уверенным.

приписка

Этот вопрос довольно похож на мой, но я не чувствую, что ответы достаточно конкретны.

1 Ответ

1 голос
/ 22 апреля 2019

Вы можете рассмотреть std::shared_mutex вместо std::mutex.

согласно объяснению КориКрамера в объяснение shared_mutex

Это соответствует вашей ситуации намного лучше, чем std::mutex.

...