Странная ошибка 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 привел меня сюда. Однако предложенное решение меня не устраивало, поэтому я хотел описать, как я решил его в своем собственном проекте.

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

Я решил проблему с мьютексом, выделив его динамически в конструкторе класса и уничтожив в деструкторе. Естественно, если вы делаете это, вы должны гарантировать, что никто не ждет мьютекса, когда вы его удаляете. Это решение работает для меня, потому что я никогда не копирую объекты из вектора, я только получаю к ним доступ внутри контейнера.

Другие вопросы по тегам