Qt多线程编程.doc

上传人:hs****ma 文档编号:543495624 上传时间:2022-09-01 格式:DOC 页数:21 大小:91.51KB
返回 下载 相关 举报
Qt多线程编程.doc_第1页
第1页 / 共21页
Qt多线程编程.doc_第2页
第2页 / 共21页
Qt多线程编程.doc_第3页
第3页 / 共21页
Qt多线程编程.doc_第4页
第4页 / 共21页
Qt多线程编程.doc_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《Qt多线程编程.doc》由会员分享,可在线阅读,更多相关《Qt多线程编程.doc(21页珍藏版)》请在金锄头文库上搜索。

1、Qt线程类 Qt 包含下面一些线程相关的类:QThread 提供了开始一个新线程的方法QThreadStorage 提供逐线程数据存储QMutex 提供相互排斥的锁,或互斥量QMutexLocker 是一个便利类,它可以自动对QMutex 加锁与解锁QReadWriterLock 提供了一个可以同时读操作的锁QReadLocker 与QWriteLocker 是便利类,它自动对QReadWriteLock 加锁与解锁QSemaphore 提供了一个整型信号量,是互斥量的泛化QWaitCondition 提供了一种方法,使得线程可以在被另外线程唤醒之前一直休眠。Qt线程的创建 Qt线程中有一个公

2、共的抽象类,所有的线程都是从这个QThread抽象类中派生的,要实现QThread中的纯虚函数run(),run()函数是通过start()函数来实现调用的。 1 class MyThread : public QThread 2 public : 3 virtual void run(); 4 ; 5 6 void MyThread:run() 7 8 for ( int count = 0 ; count 20 ; count + ) 9 sleep( 1 );10 qDebug( Ping! );11 12 13 14 int main()15 16 MyThread a;17 MyTh

3、read b;18 19 a.start(); / 自动调用run(),否则即使该线程创建,也是一开始就挂起 20 b.start();21 / 要等待线程a,b都退出 22 a.wait();23 b.wait();24 25 Qt线程同步 1.QMutex QMutex ( bool recursive = FALSE )virtual QMutex ()void lock () /试图锁定互斥量。如果另一个线程已经锁定这个互斥量,那么这次调用将阻塞 直到那个线程把它解锁。 void unlock ()bool locked ()bool tryLock () /如果另一个进程已经锁定了这

4、个互斥量,这个函数返回假,而不是一直等到这个锁可用为止,比如,它不是阻塞的。 1 / Qt 2 QMutex mutex; 3 void someMethod() 4 5 mutex. lock (); 6 qDebug( Hello ); 7 qDebug( World ); 8 mutex.unlock(); 9 10 11 / 用Java的术语,这段代码应该是: 12 void someMethod()13 14 synchronized 15 qDebug( Hello );16 qDebug( World );17 18 不过在Qt中我们可用通过另一个类来简化这种应用,因为如果使用Q

5、Mutex.lock()而没有对应的使用QMutex.unlcok()的话就会造成死锁,别的线程永远也得不到接触该mutex锁住的共享资源的机会。尽管可以不使用lock()而使用tryLock(timeout)来避免因为死等而造成的死锁( tryLock(负值)=lock(),但是还是很有可能造成错误。 对于上述的情况MFC中用CSingleLock 或 MultiLock,Boost中用boost:mutex:scoped_lock来进行解决,而在Qt中用QMutexLocker来进行解决。下面是没有采用 QMutexLocker的例子和采用 QMutexLocker的方案。 2.QMute

6、xLocker this complex function locks a QMutex upon entering the function and unlocks the mutex at all the exit points 1 int complexFunction( int flag) 2 3 mutex. lock (); 4 5 int retVal = 0 ; 6 7 switch (flag) 8 case 0 : 9 case 1 :10 mutex.unlock();11 return moreComplexFunction(flag);12 case 2 :13 14

7、 int status = anotherFunction();15 if (status 10 ) 24 mutex.unlock();25 return - 1 ;26 27 break ;28 29 30 mutex.unlock();31 return retVal;32 This example increases the likelihood that errors will occur.Using QMutexLocker greatly simplifies the code, and makes it more readable: 1 int complexFunction(

8、 int flag) 2 3 QMutexLocker locker( & mutex); 4 5 int retVal = 0 ; 6 7 switch (flag) 8 case 0 : 9 case 1 :10 return moreComplexFunction(flag);11 case 2 :12 13 int status = anotherFunction();14 if (status 10 )21 return - 1 ;22 break ;23 24 25 return retVal;26 Now, the mutex will always be unlocked wh

9、en the QMutexLocker object is destroyed (when the function returns since locker is an auto variable) . 即使在抛出异常的情况下也可以使用。 3.QReadWriteLock 用mutex进行线程同步有一个问题就是mutex只允许某个时刻只允许一个线程对共享资源进行访问,如果同时有多个线程对共享资源进行读访问,而只有一个写操作线程,那么在这种情况下如果采用mutex就成为程序运行性能的瓶颈了。在这种情况下Qt下采用QReadWriteLock来实现多个线程读,一个线程写。写线程执行的时候会阻塞所

10、有的读线程,而读线程之间的运行不需要进行同步。 1 MyData data; 2 QReadWriteLock lock ; 3 void ReaderThread:run() 4 5 6 lock .lockForRead(); 7 access_data_without_modifying_it( & data); 8 lock .unlock(); 9 10 11 void WriterThread:run()12 13 14 lock .lockForWrite();15 modify_data( & data);16 lock .unlock();17 18 19 20 QReadW

11、riterLock 与QMutex相似,除了它对 read,write访问进行区别对待。它使得多个读者可以共时访问数据。使用QReadWriteLock而不是QMutex,可以使得多线程程序更具有并发性。4.QReadLocker和QWriteLocker 对于QMutex有QMutexLocker来简化使用,而对于QReadWriteLock有 QReadLocker 和 QWriteLocker。 Heres an example that uses QReadLocker to lock and unlock a read-write lock for reading: QReadWriteLock lock ;QByteArray readData() QReadLocker locker(&lock); return data;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号