自动锁
想想这么一个函数:
int fun(int x)
{
lock(...);
if (...)
return 1;
else if (...)
return 2;
else
throw ...;
unlock(...);
}
这个时候,我们忘掉解锁的机会就太大了,多个return语句,以及可能出现的异常抛出。都有可能导致我们忘记了释放掉锁。以为我们要在每个return,throw前面加上一个unlock。
还有一个东西很重要,作用域。如果没有作用域,我们的程序世界不知道会带来怎样的一种不可想象的混乱。
因为作用域很重要,我们可以使用作用域的概念完成自动解锁功能
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》,不错的一本书。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步