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

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

即:

{ 
    pthread_mutex_lock (&myMutex); 
    sharedResource++; 
} // my mutex is now unlocked?

或者我应该:

{ 
    pthread_mutex_lock (&myMutex); 
    sharedResource++;
    pthread_mutex_unlock (&myMutex);
}
最佳答案
在您的示例中,互斥锁不会超出范围;并且编译器无法知道特定函数需要在作用域的末尾调用,因此第一个示例不会解锁互斥锁.

如果您正在使用(容易出错)函数来锁定和解锁互斥锁,那么您需要确保始终调用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)

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

转载注明原文:c – 当互斥量超出范围时,互斥锁会解锁吗? - 代码日志