Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Can';当与std::deque一起使用时,是否将Boost::mutex作为私有类成员?_C++_Multithreading_Boost_Boost Thread_Deque - Fatal编程技术网

C++ Can';当与std::deque一起使用时,是否将Boost::mutex作为私有类成员?

C++ Can';当与std::deque一起使用时,是否将Boost::mutex作为私有类成员?,c++,multithreading,boost,boost-thread,deque,C++,Multithreading,Boost,Boost Thread,Deque,我在使用deque和boost::mutex时遇到了一些问题,我制作了一个简单的示例,将使用下面的错误进行编译 问题是我想要一个类的deque,它有一个或多个互斥体作为私有成员。尽管当前示例给出了一个错误: 错误C2248:“boost::mutex::mutex”:无法访问在类“boost::mutex”中声明的私有成员 我看过一些相关的帖子,但到目前为止,我还没有设法解决这个具体问题 任何帮助都将不胜感激 #include <iostream> #include <bo

我在使用deque和boost::mutex时遇到了一些问题,我制作了一个简单的示例,将使用下面的错误进行编译

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

错误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;  
};
#包括
#包括
#包括
使用名称空间std;
类对象{
公众:
作废处理(作废)
{
m_mutex.lock();
//做点什么
a=a*10;
m_mutex.unlock();
}
对象(intv){a=v;}
私人:
INTA;
boost::mutex m_mutex;
};
int main(int argc,char*argv[])
{
deque obj;
对象推回(对象(1));
物体推回(物体(2));
物体推回(物体(3));
obj.at(0.process();
obj.at(1.process();
obj.at(2.process();
返回0;
};

互斥体不可复制,因此类型的复制构造函数格式不正确


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

您不能复制互斥体,因此您也不能复制包含互斥体的类。作为一种替代方法,您可以为您的类创建一个
唯一的\u ptr
s

 std::deque<std::unique_ptr<object>> obj;
std::deque obj;
上面的一行创建了一个临时的
对象
实例,然后将其复制构造到deque元素中。由于
boost::mutex
不可复制构造,编译器无法为
对象
合成复制构造函数

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

obj.emplace_back( 1 );
emplace\u back
使
对象
实例就地构造,而不是使用复制构造


如果您没有访问C++11功能的权限,请将
对象
类更改为以下内容:

#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;
};
#包括
类对象{
公众:
作废处理(作废)
{
m_mutex->lock();
//做点什么
a=a*10;
m_互斥->解锁();
}
对象(int v)
:m_互斥体(std::make_shared())
{  
a=v;
}     
私人:
INTA;
std::共享的ptr m_互斥体;
};

在VS2008中,您可能必须使用std::tr1::shared_ptr来代替。

如果您不想费心编写复制构造函数来避免复制互斥体,可以使用from Boost

例如:

#include <boost/ptr_container/ptr_deque.hpp>
...
boost::ptr_deque<object> obj;
obj.push_back(new object());
obj[0].process()
...
#包括
...
boost::ptr_deque obj;
对象向后推(新对象());
obj[0]。进程()
...

现在,deque的行为与普通deque一样,但它从不尝试复制任何
对象
实例。

嗨,我应该提到,我已经从我读到的文章中意识到了这一点,但如何解决呢?自定义复制构造函数会是什么样子?我不明白。通过在自定义副本构造函数中省略互斥体副本,您可能避免了一个问题而创建了另一个问题。如果一个线程获得了锁,而另一个线程对要求复制对象的
deque
执行了某些操作,该怎么办?对象(const object&o):a(o.a){}是的,这不是没有问题,但如果小心的话可以使用。这看起来不错,但在VS2008下似乎不是一个选项,只有在较新的STL中使用#include--这听起来正确吗?@AlexS您可以使用boost::shared\u ptr作为权宜之计。或者,由于您对对象的使用似乎相当本地化,原始指针可能是一个选项。@juanchopanza谢谢,但如果使用boost,则Inverse的解决方案似乎是最简单的。您应该使用范围锁定类型,而不是手动调用lock/unlock
#include <boost/ptr_container/ptr_deque.hpp>
...
boost::ptr_deque<object> obj;
obj.push_back(new object());
obj[0].process()
...