当互斥量超出范围时,互斥锁会解锁吗?

Ami*_*yar 6 c++ multithreading mutex pthreads

简单的问题 - 基本上,我是否必须解锁互斥锁,或者我可以简单地使用范围运算符并且互斥锁将自动解锁?

即:

{ 
    pthread_mutex_lock (&myMutex); 
    sharedResource++; 
} // my mutex is now unlocked?
Run Code Online (Sandbox Code Playgroud)

或者我应该:

{ 
    pthread_mutex_lock (&myMutex); 
    sharedResource++;
    pthread_mutex_unlock (&myMutex);
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*our 18

在您的示例中,互斥锁不会超出范围; 有没有办法让编译器知道一个特定的功能需要在范围内结束通话,所以第一个例子并没有解锁互斥.

如果您正在使用(容易出错)函数来锁定和解锁互斥锁,那么您需要确保始终调用unlock()- 即使受保护的操作会引发异常.

执行此操作的最佳方法是使用RAII类来管理锁定,就像使用后需要释放的任何其他资源一样:

class lock_guard {
public:
    explicit lock_guard(mutex & m) : m(m) {mutex_lock(m);}
    ~lock_guard() {mutex_unlock(m);}

    lock_guard(lock_guard const &) = delete;
    void operator=(lock_guard &) = delete;

private:
    mutex & m;
};

// Usage
{
    lock_guard lock(myMutex);
    shared_resource++;
} // mutex is unlocked here (even if an exception was thrown)
Run Code Online (Sandbox Code Playgroud)

在现代C++中,使用std::lock_guardstd::unique_lock为此.