Raj*_*war 3 c++ critical-section boost-mutex
目前在我的代码中我有这样的部分
boost::mutex Mymutex
void methodA()
{
boost::mutex::scoped_lock lock(Mymutex);
......
......
......
}
Run Code Online (Sandbox Code Playgroud)
我读到关键部分比互斥锁更快?所以我正在做这样的事情,我想知道这是否更快.
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
}
Run Code Online (Sandbox Code Playgroud)
第二种方法更快吗?我主要使用互斥锁的原因是为了防止竞争条件和锁定对方法的访问,以便一个线程一次访问它.还有什么比这更快的吗?我的另一个问题是声明
boost::lock_guard<boost::recursive_mutex> lock(m_guard);
Run Code Online (Sandbox Code Playgroud)
似乎每次调用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
}
}
Run Code Online (Sandbox Code Playgroud)
还有什么比这更快的吗?
如果在您的情况下忙碌等待是合适的,您可以尝试使用在其上实现的自旋锁boost::atomic_flag.
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
}
Run Code Online (Sandbox Code Playgroud)
boost::lock_guard<boost::recursive_mutex> lock(m_guard);似乎每次调用methodA()都会在堆栈上创建锁.
它不是锁,它只是RAII包装器,它在构造函数中锁定互斥锁并在析构函数中释放它.可以在堆栈上创建lock_guard.
| 归档时间: |
|
| 查看次数: |
3237 次 |
| 最近记录: |