提升进程间锁持久性

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 我已经更新了我的答案,说明了如何完成。

以上是关于提升进程间锁持久性的主要内容,如果未能解决你的问题,请参考以下文章

传奇怎么写一个NPC提升装备攻击倍数的脚本啊 请高手解答 比如 我添加一个1.5倍的石头 按持久计算倍数

ipc基础

python SharedMemory 进程间持久化

多进程:持久池?

Redis中RDB和AOF持久化区别和联系

redis-持久化