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_guard或std::unique_lock为此.