这段代码有啥比 boost mutex 更快的吗?

Posted

技术标签:

【中文标题】这段代码有啥比 boost mutex 更快的吗?【英文标题】:Is there anything Faster than a boost mutex for this code?这段代码有什么比 boost mutex 更快的吗? 【发布时间】:2013-04-11 02:36:45 【问题描述】:

目前在我的代码中有这样的部分

boost::mutex Mymutex

void methodA()

   boost::mutex::scoped_lock lock(Mymutex);
   ......
   ......
   ......

我读到关键部分比互斥锁快?所以我正在做这样的事情,我想知道这是否更快。

 boost::recursive_mutex m_guard;
 void methodA()
 
       // this section is not locked
      
          boost::lock_guard<boost::recursive_mutex> lock(m_guard);
         // this section is locked
      
      //This section not locked
     

第二种方法更快吗?我主要使用互斥锁的原因是为了防止竞争条件和锁定对方法的访问,以便一个线程一次访问它。有什么比这更快的吗?我的另一个担忧是声明

  boost::lock_guard<boost::recursive_mutex> lock(m_guard);

似乎每次调用methodA()都会在堆栈上创建锁。 我正在考虑将锁声明为静态变量,因此每次调用此方法时都不会在堆栈上创建它。在这种情况下,我该如何添加 m_guard 到它。比如

 boost::recursive_mutex SomeClass::m_guard; //This is static 
 boost::lock_guard<boost::recursive_mutex> SomeClass::lock //Suppose this is static
 void SomeClass::methodA()
 

      
         //How do i make lock "lock" mguard 

      

     

【问题讨论】:

【参考方案1】:

还有什么比这更快的吗?

如果busy-wait 适合您的情况,您可以尝试使用在boost::atomic_flag 之上实现的spinlock。

所以:When should one use a spinlock instead of mutex?

class spinlock

    atomic_flag flag = ATOMIC_FLAG_INIT;
public:
    void lock()
    
        while(flag.test_and_set(memory_order_acquire));
    
    void unlock()
    
        flag.clear(memory_order_release);
    
;

void foo()

    static spinlock lock;
    lock_guard<spinlock> guard(lock);
    // do job

boost::lock_guard&lt;boost::recursive_mutex&gt; lock(m_guard);似乎每次调用methodA()都会在堆栈上创建锁。

它不是锁,它只是 RAII 包装器,它在构造函数中锁定互斥体并在析构函数中释放它。没关系,在栈上创建lock_guard。

【讨论】:

我从来没有机会使用 atomic_flag 是在 atomic.hpp 中吗?

以上是关于这段代码有啥比 boost mutex 更快的吗?的主要内容,如果未能解决你的问题,请参考以下文章

.NET 中有啥比 SqlDataReader 更快的吗?

有啥比 CORBA 更适合跨语言程序通信的吗?

有啥比 document.execCommand 更好的吗?

在 css 中有啥比 !important 更重要的吗?

从命令行向 python 程序传递参数,有啥比 sys.argv 更好的吗? [复制]

有啥比在 Java Spring Boot 中使用自定义查询更好的方法?