1

我在以下方法中使用 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);

};

据我在谷歌here中搜索此错误,该问题的解决方案表示为

为互斥锁或包含互斥锁的类放置(智能)指针

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

错误是

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

4

2 回答 2

3

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

如果您不想要资源的副本,您可能会喜欢不同的互斥体,因此您需要编写自己的复制构造函数。如果您不想复制的对象共享互斥锁,您可以使用 shared_ptr。

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

于 2012-08-10T06:15:49.830 回答
1

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

于 2012-08-10T06:16:01.717 回答