使用std :: deque时,不能将Boost :: mutex作为私有类成员吗?

时间:2012-05-29 21:06:17

标签: c++ multithreading boost boost-thread deque

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

问题是我想要一个具有一个或多个互斥锁作为私有成员的类的双端队列。虽然目前这个例子给出了一个错误:

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

我看过一些相关帖子,但到目前为止我还没有设法解决这个具体问题。

非常感谢任何帮助......

#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;  
};

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

如果您不想编写复制构造函数以避免复制互斥锁,则可以使用Boost中的Pointer Container

例如:

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

现在deque的行为就像普通双端队列一样,但它永远不会尝试复制任何object个实例。

答案 3 :(得分:2)

您无法复制互斥锁,因此您也无法复制包含互斥锁的类。作为替代方案,您可以为您的班级制作unique_ptr的双击

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