ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 这个代码有没有比boost mutex更快的东西?

2019-09-01 02:14:22  阅读:189  来源: 互联网

标签:boost-mutex critical-section c


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

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()都会在堆栈上创建锁.
我正在考虑将lock声明为静态变量,因此每次调用此方法时都不会在堆栈上创建它.在这种情况下,如何将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 

      }

 }    

解决方法:

Is there anything faster than that ?

如果在您的情况下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<boost::recursive_mutex> lock(m_guard); it seems that everytime methodA() would be called lock would be created on the stack.

它不是锁,它只是RAII包装器,它在构造函数中锁定互斥锁并在析构函数中释放它.可以在堆栈上创建lock_guard.

标签:boost-mutex,critical-section,c
来源: https://codeday.me/bug/20190901/1780193.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有