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

时间:2012-08-10 05:26:34

标签: c++ boost-thread boost-mutex

我在MessageQueue类中使用boost mutex作为以下方法中的私有成员

 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 here中搜索此错误而言,该问题的解决方案表示为

  

为互斥锁或包含互斥锁的类

放置(智能)指针

但这是否意味着我只能通过传递指针在整个项目中使用一个互斥变量?为什么提升是保护互斥锁

错误是

  

错误7错误C2248:'boost :: mutex :: mutex':无法访问类'boost :: mutex'中声明的私有成员

2 个答案:

答案 0 :(得分:3)

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

如果你不是资源机会的副本,你就像一个不同的互斥体,所以你需要写你自己的复制构造函数。如果您不想复制的对象共享互斥锁,则可以使用shared_ptr。

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

答案 1 :(得分:1)

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