2

我在使用 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

4 回答 4

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

于 2012-05-29T21:32:00.773 回答
3

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

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

于 2012-05-29T21:09:14.703 回答
3

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

例如:

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

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

于 2012-05-29T21:33:56.473 回答
2

您不能复制互斥锁,因此您也不能复制包含互斥锁的类。作为替代方案,您可以unique_ptr为您的班级创建一个 s的双端队列

 std::deque<std::unique_ptr<object>> obj;
于 2012-05-29T21:10:59.973 回答