【问题标题】:Using Boost mutex in two different classes在两个不同的类中使用 Boost 互斥锁
【发布时间】:2012-08-10 05:26:34
【问题描述】:

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

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

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

错误是

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

【问题讨论】:

  • 您实际上并没有提供错误,它与您发布的链接上的相同吗?
  • 对不起,我编辑了错误的帖子
  • 不明白 Dequee() 方法中使用的Request结构在哪里?
  • 我编辑的reqCollection是一张地图地图 reqCollection;

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


【解决方案1】:

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

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

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

【讨论】:

  • 这是一个很好的解释,但我不会一遍又一遍地得到一些东西。我读到的每一个地方都在说明你提到的“编译器生成的复制构造函数试图复制互斥锁,但它的复制构造函数是私有的。因此错误”,我不明白。在 C# 和 Java 中这不是问题,因为 MessageQueue 和 Request 是 2 个不同的类,那么如何复制相同的 Mutex?
  • 我认为实际问题是在将请求插入地图时。这将复制请求。我现在很清楚,我给你的替代方案就是你需要使用的。 p.s.关于编译器生成的构造函数的 Visual C++ 错误通常对于查明实际错误所在的位置不是很有帮助。
  • 你的正确就是问题所在。正如您所说,Visual C++ 错误并没有那么清楚。我会调查的。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多