1. 互斥量:QMutex QMutex類提供的是線程之間的訪問順序化。QMutex的目的是保護(hù)一個(gè)對象/數(shù)據(jù)結(jié)構(gòu)或者代碼段在同一時(shí)間只有一個(gè)線程可以訪問?;臼褂梅椒ㄈ缦拢?QMutex mutex; int var; void function() { mutex.lock(); // 訪問var var * var; mutex.unlock(); } 如果使用mutex加鎖,卻沒有使用unlock解鎖,那么就會(huì)造成死鎖,其他線程永遠(yuǎn)也得不到訪問變量的機(jī)會(huì),所以為了解決這個(gè)問題,Qt引入了QMutexLocker類,二者直接可以配合使用更加方便簡潔,示例如下: QMutex mutex; int var; void function() { QMutextLocker locker(&mutex); // 訪問var var * var; }
2. QReadWriteLock QMutex只允許某個(gè)時(shí)刻有一個(gè)線程對共享資源進(jìn)行訪問,如果需要多個(gè)線程對共享資源進(jìn)行讀訪問,同時(shí)只有一個(gè)線程進(jìn)行寫訪問,這種情況下就可以使用QReadWriteLock。QReadWriteLock主要實(shí)現(xiàn)多個(gè)線程讀資源,一個(gè)線程寫。寫線程執(zhí)行的時(shí)候會(huì)阻塞所有的讀線程,而讀線程之間的運(yùn)行不需要進(jìn)行同步。使用示例如下: int var; QReadWriteLock lock; void function() { lock.lockForRead(); int x = var; lock.unlock(); } void function2() { lock.lockForWrite(); var = 100; lock.unlock(); } 和QMutexLocker一樣,Qt同樣提供了QReadLocker和QWriteLocker。 int var; QReadWriteLock lock; void fun() { QReadLocker(&lock); int x = var; } void fun2() { QWriteLocker(&lock); var = 1000; }
3. QSemaphore QSemaphore是QMutex的一般化,它可以保護(hù)一定數(shù)量的相同資源,而QMutex只能保護(hù)一個(gè)資源。信號量比互斥量具有更好的并發(fā)性,我們可以利用信號量實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者模式,如下所示: const int dataSize = 100000; const int bufferSize = 1024; char buffer[bufferSize]; QSemaphore freeBytes(bufferSize); QSemaphore usedButes; void Producer::run() { for (int i = 0; i < dataSize; ++i) { freeBytes.acquire(); buffer[i % bufferSize] = i; usedBytes.release(); } } void Consumer::run() { for (int i = 0; i < dataSize; ++i) { usedBytes.acquire(); qDebug() << buffer[i % bufferSize]; freeBytes.release(); } }
更多關(guān)于物聯(lián)網(wǎng)培訓(xùn)的問題,歡迎咨詢千鋒教育在線名師。千鋒教育擁有多年IT培訓(xùn)服務(wù)經(jīng)驗(yàn),采用全程面授高品質(zhì)、高體驗(yàn)培養(yǎng)模式,擁有國內(nèi)一體化教學(xué)管理及學(xué)員服務(wù),助力更多學(xué)員實(shí)現(xiàn)高薪夢想。