QMutex

原文地址:http://blog.sina.com.cn/s/blog_9542b5c70101bgvy.html,十分感谢作者的总结!

如果对作者造成任何不便,请联系我删除。

QMutex类:用在串行线程的访问中。

应用时,要#include,互斥量QMutex有两个模式:Recursive循环递归模式和NonRecursive非循环模式。循环模式下,一个线程可以对一个互斥量重复锁多次,并且只有许多解锁后才能对这个互斥量进行解锁。非循环模式下,一个线程对一个互斥量只能锁一次。默认情况下,使用非循环模式。
QMutex类的构造函数为:QMutex(RecursionMode mode=NonRecursive);用来初始化一个互斥量,且状态为未锁。
QMutex类的析构函数就不用说了。
QMutex的几个常用函数,也是它的所有函数有如下几个:
void lock();用来锁一个互斥量,当拥有这个互斥量后,其他线程就不能再用,只能等待当这个互斥量被释放后,其他线程才可以获得这个锁。
void tryLock();试着锁一个互斥量,当获得锁后,返回true;如果其他线程已经锁住这个互斥量,则返回false。
void unlock();释放互斥锁,使得其他正在等待的线程就可以使用这个互斥量了。
 
这个互斥锁(互斥量)用处很大,可以使同时正在请求的线程在同一个时间只能有一个在工作,即同一个时间里,只有一个线程拥有这个互斥锁,而不至于许多线程同时请求而出现拥堵状态。当这个互斥锁被释放后,其他线程才能得到这个互斥锁。
举例说明:
 int number = 6;
 void method1()
 {
     number *= 5;   //number=30
     number /= 4;   //number=7
 }
 void method2()
 {
     number *= 3;   //number=21
     number /= 2;   //number=10
 }
 
 先后调用这两个函数后可以看到number=10
 如果有两个线程thread1和thread2,线程1调用函数method1,
 线程2调用函数method2
 
 首先thread 1调用method1()
 number *= 5;        // number=30
 这时很可能线程1被置于休眠状态,那么线程2就启动了。
 然后thread 2调用method2()
 number *= 3;        // number=90
 number /= 2;        // number=45
 然后线程1继续执行
 number /= 4;        // number=11
 最后发现number=11,而不是分别执行时得到的10.这就与我们
 预期得到的结果有所不同了。达不到预期的效果。如果使用互斥锁
 就可以达到,如下:
 QMutex mutex;
 int number = 6;
 void method1()
 {
     mutex.lock();
     number *= 5;
     number /= 4;
     mutex.unlock();
 }
 void method2()
 {
     mutex.lock();
     number *= 3;
     number /= 2;
     mutex.unlock();
 }
 
 这样,就会执行完一个函数后,再执行其他函数。
 
 同样,我们的应用中,当通信口中有多个0x10请求包时,通信口如何执行呢?
 如第一个通信口写abcd,第二个通信口写1234,如果没有互斥锁,那么执行
 结果就是未知的,很可能是a123bc4d,也很可能是其ab1234cd等等,而我们所
 希望的是写完一个数据包abcd后,再写另外一个数据包1234,没有互斥锁,是
 达不到预期的结果的。使用互斥锁时:
 int Comm232::send(u8* data,int dataSize)
{
   mutex.lock();
   write(data,dataSize);
   mutex.unlock();
   return 0;
}
 
lock()后不要忘记unlock().
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值