淘豆网
1/7
0/100
您的浏览器不支持进度条
更多>>该用户其他文档
下载所得到的文件列表
QT多线程.doc
文档介绍:
QT多线程QT多线程的学习QT通过三种形式提供了对线程的支持。它们分别是,一、平台无关的线程类,二、线程安全的事件投递,三、跨线程的信号-槽连接。线程类Qt包含下面一些线程相关的类:QThread提供了开始一个新线程的方法QThreadStorage提供逐线程数据存储QMutex提供相互排斥的锁,或互斥量QMutexLocker是一个便利类,它可以自动对QMutex加锁与解锁QReadWriterLock提供了一个可以同时读操作的锁利类,它自动对QReadWriteLock加锁与解锁QReadLocker与QWriteLocker是便QSemaphore提供了一个整型信号量,是互斥量的泛化QWaitCondition提供了一种方法,使得线程可以在被另外线程唤醒之前一直休眠。QWaitCondition允许线程在某些情况发生时唤醒另外的线程。一个或多个线程可以阻塞等待一QWaitCondition,用wakeOne()或wakeAll()设置一个条件。wakeOne()随机唤醒一个,wakeAll()唤醒所有。可重入与线程安全在Qt文档中,术语“可重入”与“线程安全”被用来说明一个函数如何用于多线程程序。假如一个类的任何函数在此类的多个不同的实例上,可以被多个线程同时调用,那么这个类被称为是“可重入”的。假如不同的线程作用在同一个实例上仍可以正常工作,那么称之为“线程安全”的。大多数c++类天生就是可重入的,因为它们典型地仅仅引用成员数据。任何线程可以在类的一个实例上调用这样的成员函数,只要没有别的线程在同一个实例上调用这个成员函数。举例来讲,下面的Counter类是可重入的:classCounter{public:Counter(){n=0;}voidincrement(){++n;}voiddecrement(){--n;}intvalue()const{returnn;}private:intn;};这个类不是线程安全的,因为假如多个线程都试图修改数据成员n,结果未定义。这是因为c++中的++和--操作符不是原子操作。实际上,它们会被扩展为三个机器指令:1,把变量值装入寄存器2,增加或减少寄存器中的值3,把寄存器中的值写回内存假如线程A与B同时装载变量的旧值,在寄存器中增值,回写。他们写操作重叠了,导致变量值仅增加了一次。很明显,访问应该串行化:A执行123步骤时不应被打断。使这个类成为线程安全的最简单方法是使用QMutex来保护数据成员:classCounter{public:Counter(){n=0;}voidincrement(){QMutexLockerlocker(&mutex);++n;}voiddecrement(){QMutexLockerlocker(&mutex);--n;}intvalue()const{QMutexLockerlocker(&mutex);returnn;}private:mutableQMutexmutex;intn;};QMutexLocker类在构造函数中自动对mutex进行加锁,在析构函数中进行解锁。随便一提的是,mutex使用了mutable关键字来修饰,因为我们在value()函数中对mutex进行加锁与解锁操作,而value()是一个const函数。大多数Qt类是可重入,非线程安全的。有一些 内容来自淘豆网www.taodocs.com转载请标明出处.