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

я использую мьютекс повышения в классе 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 здесь решение для проблема заявлена ​​как

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

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

ошибка

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


person Navin    schedule 10.08.2012    source источник
comment
Вы на самом деле не указываете ошибку, она такая же, как в ссылке, которую вы разместили?   -  person badger the bold    schedule 10.08.2012
comment
извините, я отредактировал сообщение с ошибкой   -  person Navin    schedule 10.08.2012
comment
Я не понимаю, где структура запроса используется в методе Dequee()?   -  person Lyubomir Vasilev    schedule 10.08.2012
comment
я отредактировал reqCollection — это карта map‹size_t, Request› reqCollection;   -  person Navin    schedule 10.08.2012
comment
stackoverflow.com/ вопросы/3983588/   -  person TheSteve    schedule 10.08.2012
comment
Я не хочу, чтобы мьютекс был статичным, мне нужны два разных мьютекса для двух разных классов. но класс MessageQueue имеет экземпляр класса Request. когда я удаляю экземпляр, возникает ошибка.   -  person Navin    schedule 10.08.2012


Ответы (2)


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

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

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

person badger the bold    schedule 10.08.2012
comment
Это хорошее объяснение, но я не получаю несколько вещей снова и снова. Везде, где я читал, они заявляют, что вы упомянули, что сгенерированный компилятором конструктор копирования пытается скопировать мьютекс, но его конструктор копирования является закрытым. отсюда и ошибка, я не понимаю. в C# и Java это не проблема, потому что MessageQueue и Request — это два разных класса, так как же можно скопировать один и тот же мьютекс? - person Navin; 10.08.2012
comment
Я думаю, что настоящая проблема заключается в том, чтобы вставить запрос на карту. Это копирует запрос. Теперь мне ясно, что альтернатива, которую я вам дал, — это то, что вам нужно использовать. p.s. Ошибки Visual C++, связанные с конструкторами, сгенерированными компилятором, обычно не очень помогают определить, где находится фактическая ошибка. - person badger the bold; 10.08.2012
comment
Вы правы, вот в чем проблема. Как вы сказали, ошибки Visual C++ не так очевидны. Я посмотрю на это. - person Navin; 10.08.2012

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

person Alexander Chertov    schedule 10.08.2012