關於 Qt 線程同步執行個體介紹(2)

來源:互聯網
上載者:User

http://mobile.51cto.com/symbian-272643_1.htm


    這裡我們把void stop()函數,重新定義下,讓他以布爾形式返回,實際也沒有啥用...只為樣本的示範效果~~

     
    1. bool Thread::stop()  
    2. {  
    3.     m_stop = true;  
    4.     return m_stop;  

    現在問題出來了,如果要在stop()函數中使用mutex進行互斥操作,但unlock()操作寫在那裡?unlock()操作卻不得不再return之後,從而導致unlock()操作永遠也無法執行...

    Qt提供了QMutexLocker類何以簡化互斥量的處理,它在建構函式中接受一個QMutex對象作為參數並將其鎖定,在解構函式中解鎖這個互斥量。

    這樣可以像下面這樣重新編寫stop()函數:

     
    1. bool Thread::stop()  
    2. {  
    3.     QMutexLocker locker(&mutex);  
    4.     m_stop = true;  
    5.     return m_stop;  

    QReadWriteLocker、QReadLocker、QWriteLocker

    下面是一段對QReadWriteLocker類的對象進行,讀寫鎖的操作,比較簡單,這裡也不多做講解了,自己看吧

     
    1. MyData data;  
    2. QReadWriteLock lock;  
    3. void ReaderThread::run()  
    4. {  
    5.     ...  
    6.     lock.lockForRead();  
    7.     access_data_without_modifying_it(&data);  
    8.     lock.unlock();  
    9.     ...  
    10. }  
    11. void WriterThread::run()  
    12. {  
    13.     ...  
    14.     lock.lockForWrite();  
    15.     modify_data(&data);  
    16.     lock.unlock();  
    17.     ...  

    QSemphore

    Qt中的訊號量是由QSemaphore類提供的,訊號量可以理解為互斥量功能的擴充,互斥量只能鎖定一次而訊號量可以擷取多次,它可以用來保護一定數量的同種資源。

    acquire(n)函數用於擷取n個資源,當沒有足夠的資源時調用者將被阻塞直到有足夠的可用資源。release(n)函數用於釋放n個資源。

    QSemaphore類還提供了一個tryAcquire(n)函數,在沒有足夠的資源是該函數會立即返回。

    一個典型的訊號量應用程式是在兩個線程間傳遞一定數量的資料(DataSize),而這兩個線程使用一定大小(BufferSize)的共用迴圈緩衝。

     
    1. const int DataSize = 100000;  
    2. const int BufferSize = 4096;  
    3. char buffer[BufferSize]; 

    生產者線程向緩衝中寫入資料,直到它到達終點,然後在起點重新開始,覆蓋已經存在的資料。消費者線程讀取前者產生的資料。

    生產者、消費者執行個體中對同步的需求有兩處,如果生產者過快的產生資料,將會覆蓋消費者還沒有讀取的資料,如果消費者過快的讀取資料,將越過生產者並且讀取到一些垃圾資料。

    解決這個問題的一個有效方法是使用兩個訊號量:

     
    1. QSemaphore freeSpace(BufferSize);  
    2. QSemaphore usedSpace(0); 

    freeSpace訊號量控制生產者可以填充資料的緩衝部分。usedSpace訊號量控制消費者可以讀取的地區。這兩個訊號量是互補的。其中freeSpace訊號量被初始化為BufferSize(4096),表示程式一開始有BufferSize個緩衝區單元可被填充,而訊號量usedSpace被初始化為0,表示程式一開始緩衝區中沒有資料可供讀取。

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.