Странная ошибка boost mutex с приватным членом
У меня странная ошибка.
class INST
{
public:
boost::mutex m_mutex;
};
std::vector<INST> m_inst;
ошибка C2248: 'boost::mutex::mutex': невозможно получить доступ к закрытому члену, объявленному в классе 'boost:: mutex', см. объявление 'boost:: mutex:: mutex'
Тем не менее, мой другой класс в порядке,
class VIEW
{
public:
boost::mutex m_mutex;
};
VIEW m_view;
Я что-то здесь упускаю? Я пытался объявить m_mutex частным, но все еще имею ту же проблему.
Благодарю.
2 ответа
Мьютексы не могут быть скопированы, поэтому вы не можете поместить их в контейнер, который скопировал бы мьютекс. Ошибка, скорее всего, относится к конструктору закрытых копий мьютекса.
Я понимаю, что этот вопрос действительно старый, но сегодня я столкнулся с той же проблемой, и Google привел меня сюда. Однако предложенное решение меня не устраивало, поэтому я хотел описать, как я решил его в своем собственном проекте.
У меня есть такой же класс векторов, как и у вас, и я управляю им таким образом, чтобы после того, как начинается доступ к членам вектора, размер вектора никогда не будет изменен. Я хочу, чтобы была возможность изменить размер вектора несколько раз в начале, но до начала обработки. Я также хотел позволить потокам работать с любым из элементов вектора в режиме произвольного доступа.
Я решил проблему с мьютексом, выделив его динамически в конструкторе класса и уничтожив в деструкторе. Естественно, если вы делаете это, вы должны гарантировать, что никто не ждет мьютекса, когда вы его удаляете. Это решение работает для меня, потому что я никогда не копирую объекты из вектора, я только получаю к ним доступ внутри контейнера.