我有一个类设计为一些提升共享内存的包装。当我尝试将一个named_mutex作为一个类成员并在构造函数中初始化它时,出现编译错误。这里是相关的代码:作为类成员提升进程间named_mutex
template< class T > class SharedMemoryVal
{
public:
SharedMemoryVal(const std::string &name, bool readOnly);
SharedMemoryVal(const SharedMemoryVal& other)
{
name = other.name;
mutexName = other.mutexName;
permissions = other.permissions;
shm = other.shm;
mutex = boost::interprocess::named_upgradable_mutex(boost::interprocess::open_or_create, mutexName.c_str());
}
const SharedMemoryVal& operator=(const SharedMemoryVal& other)
{
if(this == &other)
return *this;
name = other.name;
mutexName = other.mutexName;
permissions = other.permissions;
shm = other.shm;
mutex = boost::interprocess::named_upgradable_mutex(boost::interprocess::open_or_create, mutexName.c_str());
}
int8_t GetVal(T *val);
int8_t SetVal(T val);
virtual ~SharedMemoryVal();
private:
std::string name;
std::string mutexName;
boost::interprocess::mode_t permissions;
boost::interprocess::shared_memory_object shm;
mutable boost::interprocess::named_upgradable_mutex mutex;
};
using namespace boost::interprocess;
/**
* Construct new shared memory data value
* @param[in] name - Name of shared memory segment
* @param[in] readOnly
*/
template< class T > SharedMemoryVal<T>::SharedMemoryVal(const std::string &name, bool readOnly)
{
// Set name
this->name = name;
// Create mutex
mutexName = this->name.append("_mutex");
/* GETTING AN ERROR HERE */
/* error: \u2018boost::interprocess::named_upgradable_mutex::named_upgradable_mutex()\u2019 is private*/
mutex = named_upgradable_mutex(open_or_create, mutexName.c_str());
//Create a shared memory object.
if(readOnly)
{
permissions = read_only;
shm = shared_memory_object(open_only, name.c_str(), read_only);
}
else
{
permissions = read_write;
shm = shared_memory_object(create_only, name.c_str(), read_write);
// Set size
shm.truncate(sizeof(T));
}
}
template< class T > SharedMemoryVal<T>::~SharedMemoryVal()
{
shared_memory_object::remove(name.c_str());
named_upgradable_mutex::remove(mutexName.c_str());
}
/**
* Return current data value
* @return current data value
*/
template< class T > int8_t SharedMemoryVal<T>::GetVal(T *val)
{
int8_t retVal = -1;
//Map the whole shared memory in this process
mapped_region region(shm, permissions);
// Get data pointer
T *data = static_cast< T * >(region.get_address());
// Lock
{
// This will only lock if someone else is writing.
// Multiple processes can read at the same time
sharable_lock<named_upgradable_mutex> lock(mutex);
// If there wasn't a problem getting the data
if(data != NULL)
{
*val = *data;
retVal = 0;
}
}
return retVal;
}
/**
* Set shared memory data value
* @param[in] val - value to set
*/
template< class T > int8_t SharedMemoryVal<T>::SetVal(T val)
{
int8_t retVal = -1;
//Map the whole shared memory in this process
mapped_region region(shm, permissions);
// Get data pointer
T *data = static_cast< T * >(region.get_address());
// Do lock
{
// Lock will always be unlocked at the end of this block
scoped_lock<named_upgradable_mutex> lock(mutex);
// If we got the data OK
if(data != NULL)
{
*data = val;
retVal = 0;
}
}
return retVal;
}
我收到一个错误,在我创建一个锁对象的构造函数,但我找不出原因。我读过我必须定义我自己的拷贝构造函数和赋值运算符,并且我已经完成了。有任何想法吗?
这是完美的。谢谢! – nrcrast 2014-09-24 20:23:13
你很好 – ds27680 2014-09-24 20:36:43