在两个不同的类中使用 Boost 互斥锁



>我在以下方法中使用 MessageQueue 类中的 boost 互斥锁作为私有成员

 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:"提升::互斥::互斥":

无法访问在类"提升::互斥"中声明的私有成员

互斥锁不能复制,它是一个系统资源,所以如果你在某个被复制的类中拥有它,编译器生成的复制构造函数被调用,编译器生成的复制构造函数试图复制互斥锁,但它的复制构造函数是私有的。 因此错误。

如果你想要资源的副本,那么你很可能喜欢一个不同的互斥锁,所以你需要编写自己的复制构造函数。如果您不想复制的对象来共享互斥锁,则可以使用shared_ptr。

或者,您可能根本不想复制对象,那么如果您没有 std::unique_ptr可以使用std::map< size_t, std::unique_ptr< Request > >

,请使用shared_ptr

如果您发布出现此编译错误的行,那就太好了。但我强烈怀疑您正在尝试调用 boost::mutex 类的复制构造函数,该类(构造函数)是私有的。

最新更新