- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个类被设计为一些 boost 共享内存的包装器。当我尝试将 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;
}
我在创建锁对象的构造函数中遇到错误,但我不明白为什么。我读到我必须定义自己的复制构造函数和赋值运算符,我已经做到了。有什么想法吗?
最佳答案
您收到错误是因为必须初始化互斥锁成员。
这是通过默认构造函数发生的。在这种情况下是私有(private)的。因此你得到错误(关于 boost::interprocess::named_upgradable_mutex named_upgradable_mutex() 的默认构造函数是私有(private)的)。
您所拥有的代码实际上会发生什么:在进入 SharedMemoryVal 构造函数的主体之前,将使用其默认构造函数初始化 mutex 成员。然后在正文中,您将把一个新构造的对象分配给互斥体成员。即使效率低下,只要 named_upgradable_mutex 的默认(无参数)构造函数是公共(public)的(将其设为私有(private)是有道理的,因为默认构造没有名称的互斥锁是毫无意义的)。
我建议您阅读 Scott Meyers 的 Effective C++(以及更有效的 C++)。如果您没有它们,我建议您购买它们。在 Effective C++ 第 1 章,第 4 项“确保对象在使用之前已初始化”中,您会得到类似的解释,说明如果在 ctor 主体中分配给成员变量(如上所述的默认构造+分配)与初始化会发生什么它们在初始化列表中(仅构造)。
在更有效的 C++ 中,您有两个项目。 第 12 条:在构造函数中优先初始化而不是赋值。
和
第 13 项:按照成员声明的顺序列出初始化列表中的成员。(这与下面关于初始化顺序的注释有关)更详细。
一些说明上述行为的在线 Material :Why preffer member initialization over assignment?
要解决此问题,请将互斥量的构造移至初始化列表。更多关于成员初始值设定项列表的信息在这里 Member initializer list
喜欢:
template< class T > SharedMemoryVal< T >::
SharedMemoryVal( const std::string &name, bool readOnly ) :
mutexName( name.append("_mutex") ),
mutex (open_or_create, mutexName.c_str() )
{
}
注意:请注意初始化顺序,确保mutexName先于mutex初始化。违反直觉的是,如果您在 SharedMemoryVal 类声明中的 mutex 之后声明 mutexName 成员,那么在使用它调用 mutex 构造函数时 mutexName 将未初始化,因为初始化是按照 header 中声明的顺序进行的,而不是按照成员初始化列表中的顺序进行的。在您的情况下,您在 mutex 之前声明了 mutexName,这样就可以了。只是不要将它的声明移到 header 中的互斥量之后......我想我也应该提到这一点。
关于c++ - Boost Interprocess named_mutex 作为类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26024527/
我想我一定是从名称 boost::interprocess 中假设了一些不正确的东西。文档重复 named_mutex 是全局的 here . 虽然我无法让它工作。同一个可执行文件的两个拷贝应该同时运
我使用boost::interprocess在共享内存中创建了boost::multi_index数据结构。有许多客户端进程将访问此数据结构。访问时,我将锁定数据结构。我遇到的问题是,一旦客户端进程正
我在跨进程共享名为 mutex 的 boost 时遇到问题,这些进程由不同的用户创建。第一个进程由服务创建,它以 LocalSystem 身份登录。第二个进程是自己创建的(正常执行进程即可)。 两个进
我有一个资源,我需要在一个进程内和多个进程之间保护对它的访问。我通过 boost::interprocess:named_recursive_mutex 创建一个命名的互斥锁来管理这个,它工作得很好。
我有一个应用程序实现了 boost named_mutex 以锁定 C++ 项目 (Visual Studio) 中的多个模块。我需要不惜一切代价删除所有 boost 依赖项。 还有其他方法可以实现吗
我想使用boost::interprocess 来执行跨多个进程的同步;具体来说,我想在 Linux 操作系统下使用 boost::interprocessnamed_mutex(我使用的是 g++)
我有一个类被设计为一些 boost 共享内存的包装器。当我尝试将 named_mutex 作为类成员并在构造函数中对其进行初始化时,出现编译错误。相关代码如下: template class S
我正在使用 boost 进程间共享内存,但是当我尝试使用 boost::interprocess::scoped_lock 获取 boost::interprocess:named_mutex 时很少
我遇到了一个问题,我需要一个 named_mutex 用于类中的 managed_shared_memory 成员,并收到“无法访问类 boost::interprocess::named_mutex
我做了下面的程序,但是最后还是没有删除named_mutex,打印出“Mutex delete failure”的结果 void IPC::testNamedMutex() { named_mutex
我有一个可以由多个线程创建的类。但是有一个函数需要保护代码,所以我决定使用 boost 进程间互斥体。每个类在其构造函数中创建或打开相同的 Mutex: MyClass::MyClass() {
我想从 CreatMutex 切换到 boost::interprocess::named_mutex 以将我的应用程序限制为单个实例。当应用程序正常运行和结束时,这两种方法都有效。但是,当应用程序崩
我有几个进程,但当时应该只有一个在运行。这意味着假设 Process1 正在运行,如果 Process2 启动,则 Process2 应该等到 Process1做完了。我正在考虑为此使用如下代码的bo
我是一名优秀的程序员,十分优秀!