http://mobile.51cto.com/symbian-272643_1.htm
這裡我們把void stop()函數,重新定義下,讓他以布爾形式返回,實際也沒有啥用...只為樣本的示範效果~~
- bool Thread::stop()
- {
- m_stop = true;
- return m_stop;
- }
現在問題出來了,如果要在stop()函數中使用mutex進行互斥操作,但unlock()操作寫在那裡?unlock()操作卻不得不再return之後,從而導致unlock()操作永遠也無法執行...
Qt提供了QMutexLocker類何以簡化互斥量的處理,它在建構函式中接受一個QMutex對象作為參數並將其鎖定,在解構函式中解鎖這個互斥量。
這樣可以像下面這樣重新編寫stop()函數:
- bool Thread::stop()
- {
- QMutexLocker locker(&mutex);
- m_stop = true;
- return m_stop;
- }
QReadWriteLocker、QReadLocker、QWriteLocker
下面是一段對QReadWriteLocker類的對象進行,讀寫鎖的操作,比較簡單,這裡也不多做講解了,自己看吧
- MyData data;
- QReadWriteLock lock;
- void ReaderThread::run()
- {
- ...
- lock.lockForRead();
- access_data_without_modifying_it(&data);
- lock.unlock();
- ...
- }
- void WriterThread::run()
- {
- ...
- lock.lockForWrite();
- modify_data(&data);
- lock.unlock();
- ...
- }
QSemphore
Qt中的訊號量是由QSemaphore類提供的,訊號量可以理解為互斥量功能的擴充,互斥量只能鎖定一次而訊號量可以擷取多次,它可以用來保護一定數量的同種資源。
acquire(n)函數用於擷取n個資源,當沒有足夠的資源時調用者將被阻塞直到有足夠的可用資源。release(n)函數用於釋放n個資源。
QSemaphore類還提供了一個tryAcquire(n)函數,在沒有足夠的資源是該函數會立即返回。
一個典型的訊號量應用程式是在兩個線程間傳遞一定數量的資料(DataSize),而這兩個線程使用一定大小(BufferSize)的共用迴圈緩衝。
- const int DataSize = 100000;
- const int BufferSize = 4096;
- char buffer[BufferSize];
生產者線程向緩衝中寫入資料,直到它到達終點,然後在起點重新開始,覆蓋已經存在的資料。消費者線程讀取前者產生的資料。
生產者、消費者執行個體中對同步的需求有兩處,如果生產者過快的產生資料,將會覆蓋消費者還沒有讀取的資料,如果消費者過快的讀取資料,將越過生產者並且讀取到一些垃圾資料。
解決這個問題的一個有效方法是使用兩個訊號量:
- QSemaphore freeSpace(BufferSize);
- QSemaphore usedSpace(0);
freeSpace訊號量控制生產者可以填充資料的緩衝部分。usedSpace訊號量控制消費者可以讀取的地區。這兩個訊號量是互補的。其中freeSpace訊號量被初始化為BufferSize(4096),表示程式一開始有BufferSize個緩衝區單元可被填充,而訊號量usedSpace被初始化為0,表示程式一開始緩衝區中沒有資料可供讀取。