提升进程间锁持久性
Posted
技术标签:
【中文标题】提升进程间锁持久性【英文标题】:Boost Interprocess Lock persistence 【发布时间】:2013-01-16 10:21:00 【问题描述】:我有以下代码崩溃。我怀疑这是因为分配了对我有这个问题的堆栈的引用。但我想避免每次都必须堆栈分配互斥锁和范围锁的成本
class Cache
public:
void createCacheLock(const char* name)
named_mutex mutex_(open_only, name);
mutex = &mutex_;
scoped_lock<named_mutex> cache_lock_(mutex_, defer_lock);
cache_lock=&cache_lock_ ;
void updateCache(const char* name, int newvalue)
cache_lock->lock() ;
/* Do update work */
cache_lock->unlock() ;
private:
named_mutex* mutex ;
scoped_lock<named_mutex>* cache_lock;
然后我存在该函数(cache_lock 是一个类字段),当尝试从不同的类方法中调用 cache_lock.lock 时,我的程序崩溃(在这种情况下,updateCache 在 cache_lock->lock() 部分崩溃)
我有两个问题:如何创建一个“持久”的 cache_lock,这样我就可以在不调用 named_mutex(open_only 等)的情况下重用它? ak 我想避免每次都这样做
void updateCache(const char* name, int newvalue)
named_mutex mutex_(open_only, name);
scoped_lock<named_mutex> cache_lock_(mutex_, defer_lock);
/* Do update work */
cache_lock->unlock() ;
其次,重复上述过程(即找到互斥体并从中创建锁)是一项昂贵的操作?
【问题讨论】:
变量mutex_
和cache_lock_
,是局部变量、全局变量还是成员变量?如果它们是局部变量,您是否从其他函数访问指向它们的指针?你能发一个SSCCE吗?
另外,哪里崩溃了?你试过在调试器中运行吗?
编辑以反映 cmets
【参考方案1】:
你有指向局部变量的指针。局部变量仅在函数运行时存在于堆栈中,当函数返回时,这些对象被销毁并调用它们的析构函数。这些对象占用的内存将在函数返回后被下一个要调用的函数重用。这意味着您拥有的指针不仅指向可能被破坏的对象,还可以指向用于完全不同的东西的内存。当然,引用也是如此。
使用new
分配堆上的这些对象,或使用smart pointers。
您可以在构造函数中调用类中对象的特定构造函数初始化器列表:
class cache
public:
cache(const std::string& lock_name)
: mutex_(open_only, lock_name),
cache_lock_(mutex_, defer_lock)
// ...
private:
named_mutex mutex_;
scoped_lock<named_mutex> cache_lock_;
// ...
;
【讨论】:
boost 中的互斥锁和锁似乎只能通过堆栈分配。 @user1018513 您是否尝试过将它们作为类中适当的对象实例,并在构造函数初始化列表中创建它们? 是的,但不幸的是它们的构造函数是私有的,所以这是不可能的 @user1018513 我已经更新了我的答案,说明了如何完成。以上是关于提升进程间锁持久性的主要内容,如果未能解决你的问题,请参考以下文章