QNX多執行緒同步之Barrier 屏障

2021-07-02 04:22:05 字數 3184 閱讀 3868

之前和大家介紹過qnx上的執行緒同步方法metux和semophore,通過這兩種方法可以對乙個或者幾個資源進行加鎖,避免資源使用上的衝突。在另一種情況下,某個執行緒需要在其它執行緒完成工作後才繼續執行,這時就需要使用到執行緒同步方法barrier。

舉個現實的例子,假設有三個士兵在操作一門高炮,乙個負責裝填炮彈,乙個負責調整高炮左右方向,乙個負責調整高炮角度。很明顯高炮需要在三名士兵完成任務後才能發射,否則要麼打不准,要麼炮彈根本打不出去。

一種解決方法是給高炮設定三個按鈕,只有三個按鈕都按下了高炮才發射,這樣不管哪個士兵完成任務了,他只需要按下自己負責的按鈕,一旦三個按鈕都按下,說明三個士兵的工作都完成了,就發射炮彈。

這個有三個按鈕的裝置就可以說是乙個屏障,保證高炮可以正常工作。

下面就以這個例子做乙個barrier測試。

首先需要引入標頭檔案,包括:

#include

#include

#include

#include

#include

#include

其中pthread.h和sync.h是關鍵,乙個用於執行緒建立,乙個用於barrier。

然後定義乙個pthread_barrier_t全域性變數:

pthread_barrier_t barrier;

接著在main函式裡初始化barrier:

pthread_barrier_init(&barrier, null, 3);

其中第乙個引數就是barrier變數,第三個引數是屏障需要等待的數量,本例就是等待3個士兵完成任務,所以設定成3.

然後啟動三個士兵的執行緒,每個士兵執行緒負責完成一件工作,完成之前有乙個delay的迴圈,表示完成工作需要的時間,不同士兵執行緒delay的時間不同,表示完成不同工作需要不同的時間。

所有士兵執行緒完成工作後都呼叫pthread_barrier_wait方法,通知barrier工作以完成,並開始等待,呼叫方法如下,唯一的引數就是初始化好的barrier變數:

pthread_barrier_wait(&barrier);

一旦   pthread_barrier_wait執行完成,表示所用工作都完成了,就發射炮彈,通過列印「fire!」表示。

printf("soldierx:::::::::: fire! \n");

另外,主線程啟動三個士兵執行緒後進入乙個迴圈等待,同時輸出一些時間資訊。

程式執行結果如下:

entering barrier test

creating the barrier

creating the threads

soldier1:::::::::: adjusting angle

soldier2:::::::::: adjusting direction

soldier3:::::::::: filling bullet

timer in main thread:0

timer in main thread:1

timer in main thread:2

timer in main thread:3

timer in main thread:4

soldier1:::::::::: angle ready!

timer in main thread:5

soldier2:::::::::: direction ready!

timer in main thread:6

timer in main thread:7

soldier3:::::::::: bullet ready!

soldier3::::::::::  fire!

soldier1:::::::::: fire!

soldier2::::::::::  fire!

timer in main thread:8

timer in main thread:9

end of main thread

可以看到,只有三個執行緒都完成相應任務後他們才繼續往下執行,保證了大炮可以成功發射。

完整**如下: 

[cpp]view plain

copy

#include 

#include 

#include 

#include 

#include 

#include 

pthread_barrier_t barrier;  

void

soldier1()   

printf("soldier1:::::::::: angle ready!\n"

);  

pthread_barrier_wait(&barrier);  

printf("soldier1:::::::::: fire! \n"

);  

}  void

soldier2()   

printf("soldier2:::::::::: direction ready!\n"

);  

pthread_barrier_wait(&barrier);  

printf("soldier2::::::::::  fire! \n"

);  

}  void

soldier3()   

printf("soldier3:::::::::: bullet ready!\n"

);  

pthread_barrier_wait(&barrier);  

printf("soldier3::::::::::  fire! \n"

);  

}  int

main(

intargc, 

char

*argv)   

printf("end of main thread\n"

);  

pthread_barrier_destroy(&barrier);  

return

exit_success;  

}  

QNX多執行緒同步之Barrier 屏障

之前和大家介紹過qnx上的執行緒同步方法metux和semophore,通過這兩種方法可以對乙個或者幾個資源進行加鎖,避免資源使用上的衝突。在另一種情況下,某個執行緒需要在其它執行緒完成工作後才繼續執行,這時就需要使用到執行緒同步方法barrier。舉個現實的例子,假設有三個士兵在操作一門高炮,乙個...

QNX多執行緒同步之Barrier 屏障

之前和大家介紹過qnx上的執行緒同步方法metux和semophore,通過這兩種方法可以對乙個或者幾個資源進行加鎖,避免資源使用上的衝突。在另一種情況下,某個執行緒需要在其它執行緒完成工作後才繼續執行,這時就需要使用到執行緒同步方法barrier。舉個現實的例子,假設有三個士兵在操作一門高炮,乙個...

多執行緒同步之synchronized

作用 當兩個或多個執行緒需要共享,update操作時,需要通過某種方法來確定該資源在任意時刻僅被乙個執行緒占用,實現上述目的的過程就叫同步 同步分為同步方法和同步語句 注意 synchronized宣告不會被整合,如果乙個用synchronized修飾的方法被子類覆蓋,那麼子類中這個方法不再具有同步...