原文地址: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().