欢迎来到天天文库
浏览记录
ID:58821392
大小:19.15 KB
页数:7页
时间:2020-10-25
《QT线程二(线程的同步).docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、QT线程(二)---线程同步线程互斥 多线程运行时,通常会访问同一个变量,同一个数据结构,或者同一段代码。因此,需要使用互斥技术来保护上述资源,确保多线程执行的正确性。注:我们通常说某个函数是线程安全的,也就是因为该函数实现加入了线程互斥保护。 4.1、QMutex QMutex (RecursionMode mode =NonRecursive) ~QMutex ()voidlock ()mutex加锁,如果当前其他线程已对该mutex加锁了,则该调用被阻塞直到其他线程释放
2、该mutex。booltryLock ()mutex加锁,和lock不同的是,如果当前其他线程已对该mutex加锁了,则该调用会立即返回,而不被阻塞。booltryLock (int timeout )同tryLock,和tryLock不同的是,如果当前其他线程已对该mutex加锁了,则该调用会等待一段时间,直到超时或者其他线程释放了mutex。voidunlock ()mutex解锁,释放被锁住的资源。 Mutex有两种模式,用户可以在构造函数参数中指定。 ConstantV
3、alueDescriptionQMutex::Recursive1Inthismode,athreadcanlockthesamemutexmultipletimesandthemutexwon'tbeunlockeduntilacorrespondingnumberof unlock()callshavebeenmade.该模式下,一个线程可以对mutex多次lock,直到相应次数的unlock,调用后,该mutex才真正被unlock。QMutex::NonRecursive0Inthismode
4、,athreadmayonlylockamutexonce.该模式下,mutex只能被lock一次。 实例:QMutexmutex;intnumber=6; voidmethod1(){ mutex.lock(); number*=5; number/=4; mutex.unlock();} voidmethod2(){ mutex.lock(); number*=3; number/=2; mutex.unlock();} 4.1、QMu
5、texLocker QMutexLocker (QMutex* mutex ) ~QMutexLocker ()QMutex*mutex ()constvoidrelock ()voidunlock () QMutexLocker实际上是对QMutex使用的一种简化。例如以下场景: 当某段代码存在多个分支,在对QMutex加锁后,需要在不同的分支路径下都执行解锁操作,才能保证Mutex关联的资源能被其他线程继续访问,否则就出现死锁。 QMutexLocker
6、接收一个QMutex作为参数,当创建QMutexLocker对象时,就对关联的Mutex进行了Lock操作,直到该QMutexLocker对象被销毁,相关的QMutex才被Unlock。 实例: 直接使用QMutex:intcomplexFunction(intflag){ mutex.lock(); intretVal=0; switch(flag){ case0: case1: mutex.unlock(); returnm
7、oreComplexFunction(flag); case2: { intstatus=anotherFunction(); if(status<0){ mutex.unlock(); return-2; } retVal=status+flag; } break; default: i
8、f(flag>10){ mutex.unlock(); return-1; } break; } mutex.unlock(); returnretVal;} 使用QMutexLocker:intcomplexFunction(intflag){ QMutexLockerlocker(&mutex); intretVal=0; switch(
此文档下载收益归作者所有