C++ Can';当与std::deque一起使用时,是否将Boost::mutex作为私有类成员?
我在使用deque和boost::mutex时遇到了一些问题,我制作了一个简单的示例,将使用下面的错误进行编译 问题是我想要一个类的deque,它有一个或多个互斥体作为私有成员。尽管当前示例给出了一个错误: 错误C2248:“boost::mutex::mutex”:无法访问在类“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
#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()
...