Использование Boost mutex в двух разных классах

Я использую Boost Mutex в классе MessageQueue в качестве частного члена в следующем методе

 void MessageQueue::Dequeuee()
    {
Request rq(messageWareHouse.front().reqID,messageWareHouse.front().seq,
                                                        messageWareHouse.front().sMessage);
        while(true)
        {
            boost::unique_lock<boost::mutex> lock(qMutex);
            qCond.wait(lock);

    **reqCollection**.find(messageWareHouse.front().reqID)->second.addSegments(messageWareHouse.front().seq,
                messageWareHouse.front().sMessage );
                    }
    ....

reqCollection - это карта

map<size_t, Request> reqCollection;

Внутренний запрос, когда я пытаюсь инициализировать мьютекс, я получаю сообщение об ошибке ниже

class Request
{

private:

    size_t RequestID;

public:
    boost::mutex qMutex;
    Request(size_t requestID,size_t seq, std::string sMessage);
    void addSegments(size_t seq, std::string sMessage);

};

насколько я искал эту ошибку в Google здесь решение проблемы указано как

Поместите (умные) указатели на мьютекс или класс, содержащий мьютекс

но значит ли это, что я могу использовать только одну переменную мьютекса во всем проекте, передавая указатели? Почему повышение защищает мьютекс

ошибка

Ошибка 7 ошибка C2248: 'boost::mutex::mutex': не может получить доступ к закрытому члену, объявленному в классе 'boost::mutex'

2 ответа

Решение

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

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

В качестве альтернативы вы можете вообще не копировать объекты, тогда вы можете использовать std::map< size_t, std::unique_ptr< Request > > если у вас нет std::unique_ptr, используйте shared_ptr

Было бы хорошо, если бы вы опубликовали строку, в которой вы получаете эту ошибку компиляции. Но я сильно подозреваю, что вы пытаетесь вызвать конструктор копирования класса boost::mutex, который (конструктор) является закрытым.

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