Мне нужно реализовать (на C++ )потокобезопасный контейнер таким образом, чтобы только один поток мог добавлять или удалять элементы из контейнера. Я делал такие вещи раньше, разделяя мьютекс между потоками. Это приводит к тому, что в моем коде засоряется множество объектов мьютекса, что делает вещи очень беспорядочными и сложными в обслуживании.
Мне было интересно, есть ли более аккуратный и более объектно-ориентированный способ сделать это. Я подумал о следующей простой оболочке класса вокруг контейнера (semi -псевдокода C++)
class LockedList {
private:
std::list<MyClass> m_List;
public:
MutexObject Mutex;
};
чтобы блокировку можно было сделать следующим образом
LockedList lockableList; //create instance
lockableList.Mutex.Lock(); // Lock object
... // search and add or remove items
lockableList.Mutex.Unlock(); // Unlock object
Итак, мой вопрос действительно состоит в том, чтобы спросить, является ли это хорошим подходом с точки зрения дизайна? Я знаю, что разрешение публичного доступа к членам не одобряется с точки зрения дизайна, есть ли в приведенном выше дизайне какие-либо серьезные недостатки. Если да, то есть ли лучший способ реализовать потокобезопасные объекты-контейнеры?
Я прочитал много книг по дизайну и C++ в целом, но мне кажется, что действительно не хватает литературы по многопоточному программированию и проектированию многопоточного программного обеспечения.
Если вышеизложенное является плохим подходом к решению проблемы, с которой я столкнулся, может ли кто-нибудь предложить способ ее улучшения или указать мне какую-либо информацию, которая объясняет хорошие способы разработки классов для потокобезопасности ??? Большое спасибо.