1. 互斥量:QMutex QMutex類提供的是線程之間的訪問順序化。QMutex的目的是保護一個對象/數(shù)據(jù)結(jié)構(gòu)或者代碼段在同一時間只有一個線程可以訪問。基本使用方法如下: QMutex mutex; int var; void function() { mutex.lock(); // 訪問var var * var; mutex.unlock(); } 如果使用mutex加鎖,卻沒有使用unlock解鎖,那么就會造成死鎖,其他線程永遠也得不到訪問變量的機會,所以為了解決這個問題,Qt引入了QMutexLocker類,二者直接可以配合使用更加方便簡潔,示例如下: QMutex mutex; int var; void function() { QMutextLocker locker(&mutex); // 訪問var var * var; }
2. QReadWriteLock QMutex只允許某個時刻有一個線程對共享資源進行訪問,如果需要多個線程對共享資源進行讀訪問,同時只有一個線程進行寫訪問,這種情況下就可以使用QReadWriteLock。QReadWriteLock主要實現(xiàn)多個線程讀資源,一個線程寫。寫線程執(zhí)行的時候會阻塞所有的讀線程,而讀線程之間的運行不需要進行同步。使用示例如下: 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的一般化,它可以保護一定數(shù)量的相同資源,而QMutex只能保護一個資源。信號量比互斥量具有更好的并發(fā)性,我們可以利用信號量實現(xiàn)生產(chǎn)者-消費者模式,如下所示: 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)驗,采用全程面授高品質(zhì)、高體驗培養(yǎng)模式,擁有國內(nèi)一體化教學(xué)管理及學(xué)員服務(wù),助力更多學(xué)員實現(xiàn)高薪夢想。