實驗要求:多線程
經過使用pthread library提供的條件變量來實現一個Barrier。Barrier是應用中的一個節點,全部線程到達這一結點後必須中止等待,直到全部線程都已經到達這一節點後,再繼續執行。函數
實驗過程:(代碼實現參考了https://blog.csdn.net/whyymlm/article/details/53454039的代碼)spa
下載barrier.c文件,按照題目要求編譯並運行後,獲得結果以下:.net
分析程序代碼,main()函數代碼以下:線程
main()函數的主要功能爲根據傳入參數,建立對應個數的線程,並在成功運行後,輸出經過的結果。blog
再看一下每一個線程所執行的內容:資源
這裏每一個線程會進行20000循環,每輪循環會判斷bstate中的輪數是否與本線程的當前輪數相同,若是不一樣就會報錯。因此在多線程執行時,就須要在每一個線程執行完同一輪後,在修改bstate中的round值。這就須要咱們使用barrier的概念來實現。而程序中原有的barrier代碼是直接對round進行加1操做,因此必定會出現round和本線程內的輪數不一樣的狀況,咱們須要作的就是修改barrier函數。修改內容以下:編譯
程序實現的思路爲:由於是多線程訪問,因此首先要對臨界資源進行加鎖保護,而後對bstate中的nthread進行加1操做,程序開始的結構體定義中說明了nthread的做用是標識當前round中到達barrier的線程數。因此以後判斷bstate中的nthread與總的線程數nthread是否相等,若是相等,則喚醒其餘睡眠等待的線程,將round值加1並重置nthread,最後釋放鎖;若是不相等,則釋放鎖並進入睡眠狀態,在被喚醒後再釋放鎖。thread
實驗結果:變量