Устранение лишней ошибки 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 частным, но все равно имею ту же проблему.

Спасибо.

Ответ 1

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

Ответ 2

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

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

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