多线程解决意外没解锁的情况

想想这么一个函数:

int fun(int x) {

 lock(...);

 if (...) return 1;

 else if (...) return 2;

 else throw ...;

 unlock(...);

}


 

这个时候,我们忘掉解锁的机会就太大了,多个return语句,以及可能出现的异常抛出。都有可能导致我们忘记了释放掉锁。以为我们要在每个return,throw前面加上一个unlock。

还有一个东西很重要,作用域。如果没有作用域,我们的程序世界不知道会带来怎样的一种不可想象的混乱。

 因为作用域很重要,我们可以使用作用域的概念完成自动解锁功能

定义如下一个类ScopeLock

class ScopeLock {

public:

 ScopeLock(pthread_mutex_t mutex) : mutex(_mutex)

 {

  pthread_mutex_lock(&mutex);

 }

 ~ScopeLock() {

 pthread_mutex_unlock(&mutex);

 }

private:

 pthread_mutex_t mutex;

};


 

好了,这样你就只需要在你需要锁上锁的地方顶一个一个ScopeLock的局部变量,然后就不用管了,多好的事儿啊。

需要说明这个ScopeLock不是我自己发明的,来自POSA卷2,《pattern oriented software architecture》,不错的一本书。

原文地址:https://www.cnblogs.com/byfei/p/3112172.html