QT多線程同步之QWaitcondition


使用到多線程,無可避免的會遇到同步問題,qt提供幾種同步線程的方法,在這里講一下QWaitcondition的簡單使用。

一、QWaitcondition,是通過一個線程達到某種條件來喚起另一個線程來實現同步的

mutex.lock();

waitcondition.wait(&mutex);

需要用到一個互斥量作為參數,而這個互斥量的狀態必須是locked的。

當調用這一句waitcondition.wait(&mutex) 在等待觸發條件的時候,此時的mutex已經被設置為unlocked狀態。當條件滿足wait語句朝下執行的時候

mutex又被設置為locked狀態

二、看看具體實例

                mutex.lock();

        int a,b,c;
        a =10;
        b= 2;
        c = 7;
        qDebug()<<"usedSpace"<<usedSpace;
        //if(usedSpace == BufferSize)
        waitcondition.wait(&mutex);
當多個線程執行這段代碼時,從微觀的角度看,線程會在三處阻塞等待資源,第一個是mutex.lock語句處第二個會在waitcondition.wait(&mutex);等待。這是因為waitcondition.wait(&mutex);語句相當於
下面三行代碼,這樣我們就可以看得很清楚
mutex.unlock();
waitcondition.wait(); //線程處於阻塞狀態等待信號 注意(unlock和wait是原子的)
mutex.lock(); //這句在wait()等到信號或者超時的情況下執行、喚醒和lock也是原子操作

在wait的時候mutex已經處於unlocked狀態.
第三處會在waitcondition.wait(&mutex)拆分語句里面的mutex.lock()處。

大家可能會因為如果線程都在wait處等待,還能不能保證上圖1處是臨界區(假設有共享變量).其實可以確定的說1處和2處都是臨界區,上圖整個代碼都處於臨界區(代碼段不會被多個線程同時執行)。
三、詳細分析過程
現在我們把時間放慢,放到毫秒級微妙及納秒級。假設這段代碼 同時被多個線程執行,執行開始遇到一地個mutex.lock處,第一個線程獲取鎖,后續來的所有線程都會在這個地方等待鎖資源,當第一個線程wait語句的時候。wait語句執行過程其實是執行
一下三步
mutex.unlock();
waitcondition.wait();
mutex.lock();
//這句在wait()等到信號或者超時的情況下執行
這個時候第一個線程會釋放鎖資源,自己處於條件等待狀態。那么在上面等待鎖資源的第二個線程將會獲得所資源,然后有執行到wait處,以此類推 第三
第四、第五線程一次獲得鎖資源,最后所有線程都會等待在wait處。
當條件變量滿足條件被其他線程喚醒的時候即執行wakeall或者wakeone.執行wakeall的時候所有等待線程都會被喚醒,繼續往下執行,那么大家擔心以后的語句即2處會不會有同步問題呢?不會,因為每個線程喚醒后第一個線程(或者說其中有一個線程)
獲取mutex鎖資源,然后再執行下面的語句,其他被喚醒的線程只能在這個mutex等待鎖資源。
整個過程可以理解為
這一段代碼多個線程會在多出集結等待資源,但這個代碼的執行始終是互斥的。
 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM