与 std::d eque 一起使用时,不能将 Boost::mutex 作为私有类成员吗?

Can't have Boost::mutex as private class member when using with std::deque?

本文关键字:mutex 成员 Boost 不能 一起 eque std      更新时间:2023-10-16

我在deque和boost::mutex方面遇到了一些麻烦,我做了一个简单的例子,它将使用下面的错误进行编译。

问题是我想拥有某个类的 deque,该类具有一个或多个互斥体作为私有成员。尽管目前该示例给出了一个错误:

错误 C2248:"提升::互斥::互斥":

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

我已经看到了一些相关的帖子,但到目前为止,我还没有设法解决这个特定问题。

任何帮助将不胜感激...

#include <iostream>  
#include <boost/thread.hpp>  
#include <deque>  
using namespace std;
class object {
public:
    void process(void)
    {
        m_mutex.lock();
        // do something
        a = a*10;
        m_mutex.unlock();
    }
    object(int v){  a = v; }        
private:
    int a;
    boost::mutex m_mutex;
};
int main(int argc, char* argv[])  
{
    deque<object> obj; 
    obj.push_back( object( 1 ) );
    obj.push_back( object( 2 ) );
    obj.push_back( object( 3 ) );
    obj.at(0).process();
    obj.at(1).process();
    obj.at(2).process();
    return 0;  
};
obj.push_back( object( 1 ) );

上行创建一个临时object实例,然后将其复制到 deque 元素中。由于boost::mutex不可复制构造,因此编译器无法为 object 合成复制构造函数。

如果这是您需要复制可构造object的唯一位置,请将语句更改为

obj.emplace_back( 1 );

emplace_back会导致就地构造object实例,而不是使用复制构造。


如果您无权访问 C++11 功能,请将 object 类更改为以下内容:

#include <memory>
class object {
public:
    void process(void)
    {
        m_mutex->lock();
        // do something
        a = a*10;
        m_mutex->unlock();
    }
    object(int v)
    : m_mutex( std::make_shared<boost::mutex>() )
    {  
      a = v; 
    }     
private:
    int a;
    std::shared_ptr<boost::mutex> m_mutex;
};

在VS2008中,您可能必须改用std::tr1::shared_ptr

如果您不想费心编写复制构造函数以避免复制互斥锁,则可以改用 Boost 中的指针容器。

例如:

#include <boost/ptr_container/ptr_deque.hpp>
...
boost::ptr_deque<object> obj;
obj.push_back(new object());
obj[0].process()
...

现在,双端的行为就像普通的双端面一样,但它从不尝试复制任何object实例。

互斥锁不是 CopyConstructible,因此类型的复制构造函数格式不正确。

您可以提供一个不复制互斥锁的用户定义的复制构造函数。

您不能复制互斥锁,因此您也不能复制包含互斥锁的类。作为替代方案,您可以为您的班级制作 unique_ptr s 的 deque

 std::deque<std::unique_ptr<object>> obj;