QMutex
来源:互联网 发布:威锋网mac 编辑:程序博客网 时间:2024/06/08 16:45
QMutex提供了线程间的顺序访问。
QMutex的目的是保护一个对象、数据结构或者代码段,所以同一时间只有一个线程可以访问它。(类似java的"synchronized”关键字)。互斥量最好和QMutexLocker搭配使用,因为它使得互斥量的解锁和锁定变得相当一致。
比如:
int number = 6;
void method1()
{
number *= 5;
number /= 4;
}
void method2()
{
number *= 3;
number /= 2;
}
如果这两个方法被顺序调用,那么结果如下:
// method1()
number *= 5; // number is now 30
number /= 4; // number is now 7
// method2()
number *= 3; // number is now 21
number /= 2; // number is now 10
如果两个方法被两个不同的线程同时调用,那么结果可能如下:
// Thread 1 calls method1()
number *= 5; // number is now 30
// Thread 2 calls method2().
//Thread1很可能被操作系统强制睡眠,允许Thread2运行
number *= 3; // number is now 90
number /= 2; // number is now 45
// Thread 1 finishes executing.
number /= 4; // number is now 11, instead of 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();
}
这样,任何时候就只能有一个线程可以修改数据。这虽是个简单的例子,但是它适用于任何需要按特定频率发生的情况。但你在一个线程中调用lock(),其它线程将会在同一地点试图调用lock()来阻塞,知道这个线程调用unlock()之后其它线程才会获得这个锁。lock()的一种非阻塞选择是tryLock()。
请参考: QMutexLocker, QReadWriteLock, QSemaphore, 和 QWaitCondition.
成员变量说明
enum QMutex::RecursionMode
值 说明
QMutex::Recursive 1 在该模式下,一个线程可以锁住同一互斥量多次,互斥量只有经过相同次的unlock()后才能释放。
QMutex::NonRecursive 0 在该模式下,一个互斥量只能被锁住一次。
请参考 QMutex().
成员函数说明
QMutex::QMutex ( RecursionMode mode = NonRecursive )
构造一个新的互斥量。互斥量创建时的初始状态是解锁状态。如果创建时的模式为QMutex::Recursive,一个线程可以锁住同一互斥量多次,直到互斥量只有经过相同次的unlock()后才能释放。互斥量创建时默认为QMutex::NonRecursive。
请参考 lock() 和 unlock().
QMutex::~QMutex ()
销毁一个互斥量
警告:销毁一个处于锁定状态的互斥量将导致不确定的后果
void QMutex::lock ()
锁定互斥量。如果另一个线程已经锁定该互斥量,那么这次调用将阻塞直到那个线程把它解锁。
如果它是递归互斥量,允许同一个线程多次调用该函数锁定该互斥量。如果不是递归互斥量,调用该函数将导致死锁。
请参考 unlock().
bool QMutex::tryLock ()
尝试锁定互斥量。如果获得该互斥量,返回true。如果另外的线程已经锁定该互斥量,那么函数立即返回,返回值为false。
当互斥量被锁定,必须通过unlock()解锁,这样其他的线程才能锁定该互斥量。
如果它是递归互斥量,允许同一个线程多次调用该函数锁定该互斥量。如果不是递归互斥量,调用该函数再次锁定互斥量,函数立即返回,返回值为false。
请参考lock() 和 unlock().
bool QMutex::tryLock ( int timeout )
这是tryLock 重载的函数
尝试锁定互斥量。如果获得互斥量,返回true,否则返回false。如果其他线程锁定该互斥量,该函数将等待该互斥量timeout微秒。
注意:传递一个负数作为时间参数的话,相当于调用lock()函数。
当互斥量被锁定,必须通过unlock()解锁,这样其他的线程才能锁定该互斥量。
如果它是递归互斥量,允许同一个线程多次调用该函数锁定该互斥量。如果不是递归互斥量,调用该函数再次锁定互斥量,函数立即返回,返回值为false。
请参考 lock() 和 unlock().
void QMutex::unlock ()
释放互斥量。如果在不是持有该互斥量的线程中调用unlock(),将导致一个错误。
释放一个未被锁定的互斥量将导致一个不确定的后果。
请参考 lock().
- QMutex
- QMutex
- QMutex
- QMutex
- qt QMutex(互斥量)
- QMutex 與 QMutexLocker
- QMutex 类学习笔记
- QMutex解决线程问题
- Qt多线程编程: QMutex
- Qt之多线程-QMutex
- QMutex 多线程中的互斥锁
- Qt之QMutex
- QMutex & QWaitCondition 小记!
- Qt4 Gossip: QMutex 與 QMutexLocker
- QMutex QMutexLocker简单实例应用
- QT——QMutex(互斥量)
- QMutex pointer is misaligned的问题
- Qt 线程同步(QMutex、QWaitCondition、QSemaphore)
- xml2bean 把xml文件直接封装成bean
- 博客改名
- C++ STL入门教程(5)——map(关联数组)的使用(附完整程序代码)
- Android中Message的灵活应用(转载)
- 删除无效软连接
- QMutex
- ArcGIS Server启动服务报:ERROR: Unable to start Xvfb on any port in the range 6600 - 6619
- ubuntu安装和配置SVN
- Java Servlet系列之Servlet入门
- VS2005、2008、2010快捷键大全
- RGB_D_开发征程
- Ubuntu下deb包的安装方法
- dml语句执行过程和数据写入
- Linux启动新进程的几种方法及比较