封装linux 条件互斥锁

来源:互联网 发布:淘宝一元拍卖的玉真假 编辑:程序博客网 时间:2024/06/18 15:40

简介

互斥锁在多线程程序中使用广泛,也十分重要,控制线程的同步和互斥。

条件变量时线程的另一种同步机制,给多个线程提供了一个会合的场所。条件变量与互斥变量一起使用时,允许线程以无竞争的方式等待特定的条件发生。

条件本身是受互斥量保护的。线程在改变条件状态之前必须首先锁住互斥量,其他线程在获得互斥量之前不会察觉到这种改变,因为互斥量必须在锁定之后才能计算条件。
传递给pthead_cond_wait的互斥量对条件进行保护。调用者把锁住的互斥量传给函数,函数然后自动把调用线程放在等待条件的线程列表上,对互斥量解锁。这就关闭了条件检查和线程进入休眠状态等待条件改变这两个操作之间的时间通道,这样线程就不会错过条件的任何变化。
pthread_cond_wait返回时,互斥量再次被锁住(但不销毁

在linux 线程mutex的相关函数也不少,函数名也挺长,所以用C++进行了简单的初步封装,仅当练习,希望自己能有更好的封装抽象能力。

首先封装线程互斥锁:

几个关键要点

1)互斥锁类对象不能成为条件类的成员变量,这样的组合使用会在条件对象销毁时同时销毁互斥锁,这是不对的。

2)Condition类的构造函数,不能写成

    Condition(MutexLock mutex):mutex_(mutex)    {         pthread_cond_init(&cond_,NULL);    }

这样写互斥锁参数是值传递,会进行对象拷贝,而得到的就是另一把锁了。所以必须确保互斥锁不能拷贝。

3)因此,互斥锁拷贝构造函数 & 赋值构造函数都放在private域。
为了让mutex锁不能复制,保证Condition类对象构造时获得的锁是同一把锁。

4)Condition类的成员变量不能组合互斥锁的对象。不然的话条件对象析构函数执行时会自动销毁互斥锁,而我们并不需要销毁它。

互斥锁类的封装:

这里写图片描述

条件变量类的封装:

这里写图片描述

测试:

这里写图片描述

这里写图片描述

0 0
原创粉丝点击