我在使用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;
};
答案 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;