互斥锁有作用域吗?
Does mutex have scope?
std::mutex
有作用域吗?我知道在JAVA中我们可以使用{}
来限制锁的作用范围以尽快释放锁。如果我们可以在 C++ 中做同样的事情?
void func() {
// some code
{
std::lock_guard<std::mutex> lock(mutex_);
}
// some code
}
另外,互斥量是什么时候起作用的?是一进入函数就加锁,还是一直执行到当前行被加锁?编译器对代码优化有影响吗?
void func() {
// some code
std::lock_guard<std::mutex> lock(mutex_); // mutex work here or as soon as it enters the function
// some code
}
在帮助下,我终于找到了答案。 阅读源码,再无魔力。下面是lock_guard的源代码。
template<typename _Mutex>
class lock_guard
{
public:
typedef _Mutex mutex_type;
explicit lock_guard(mutex_type& __m) : _M_device(__m)
{ _M_device.lock(); }
lock_guard(mutex_type& __m, adopt_lock_t) noexcept : _M_device(__m)
{ } // calling thread owns mutex
~lock_guard()
{ _M_device.unlock(); }
lock_guard(const lock_guard&) = delete;
lock_guard& operator=(const lock_guard&) = delete;
private:
mutex_type& _M_device;
};
"lock_guard"创建时获取锁,销毁时释放锁。
它帮助我们不要忘记释放锁。
即使程序失败,也会调用析构函数释放锁。
std::mutex
有作用域吗?我知道在JAVA中我们可以使用{}
来限制锁的作用范围以尽快释放锁。如果我们可以在 C++ 中做同样的事情?
void func() {
// some code
{
std::lock_guard<std::mutex> lock(mutex_);
}
// some code
}
另外,互斥量是什么时候起作用的?是一进入函数就加锁,还是一直执行到当前行被加锁?编译器对代码优化有影响吗?
void func() {
// some code
std::lock_guard<std::mutex> lock(mutex_); // mutex work here or as soon as it enters the function
// some code
}
在帮助下,我终于找到了答案。 阅读源码,再无魔力。下面是lock_guard的源代码。
template<typename _Mutex>
class lock_guard
{
public:
typedef _Mutex mutex_type;
explicit lock_guard(mutex_type& __m) : _M_device(__m)
{ _M_device.lock(); }
lock_guard(mutex_type& __m, adopt_lock_t) noexcept : _M_device(__m)
{ } // calling thread owns mutex
~lock_guard()
{ _M_device.unlock(); }
lock_guard(const lock_guard&) = delete;
lock_guard& operator=(const lock_guard&) = delete;
private:
mutex_type& _M_device;
};
"lock_guard"创建时获取锁,销毁时释放锁。
它帮助我们不要忘记释放锁。
即使程序失败,也会调用析构函数释放锁。