shell 多執行緒示例

2022-09-07 09:57:13 字數 1414 閱讀 2840

shell指令碼本身不支援多執行緒語法,這裡所說的多執行緒本質上是使部分**在後台執行(多程序),使cpu自動的呼叫各個程序,最大限度的利用cpu的效能。

這裡所說的能使用多執行緒的場景值得是部分**塊可以並行執行,相互之間沒有影響的情況。

#!/bin/bash

echo "begin"

for num in `seq 1 5`

do} &

done

echo "end"

則輸出結果為:

begin

end123

45

這是由於具體處理邏輯的**放到後台執行了,沒有阻塞子程序,所以end會先列印出來。為解決這種情況需要使用wait,等待當前指令碼下的所有子程序退出。

#!/bin/bash

echo "begin"

for num in `seq 1 5`

do} &

done

wait

echo "end"

則結果可能為:

begin24

135end

可以看出中間**塊的執行順序並不是與指令碼中正常執行的順序一致,這是由於這五個**塊相互獨立,執行順序由cpu的排程決定。

但這樣依然存在乙個問題:因為&使得所有迴圈體內的命令全部進入後台執行,那麼倘若迴圈的次數很多,會使作業系統在瞬間建立出所有的子程序,這會非常消耗系統的資源。如果迴圈體內的命令又很消耗系統資源,則結果可想而知。

#/bin/bash

all_num=10

# 設定併發的程序數

thread_num=5

echo begin

# mkfifo

tempfifo="my_temp_fifo"

mkfifo $

# 使檔案描述符為非阻塞式

exec 6<>$

rm -f $

# 為檔案描述符建立佔位資訊

for ((i=1;i<=$;i++))

dodone >&6

# for num in `seq 1 $`

do echo "" >&6

} &

} done

wait

# 關閉fd6管道

exec 6>&-

echo end

上述指令碼總迴圈10次,但是最多只有5個後台程序在執行。關鍵點在於檔案描述符,首先初始化的時候像檔案描述符6中寫入5個佔位符,在執行迴圈的時候最多也就能從檔案描述符中讀取5次,創造5個後台執行的**塊,

當有程序執行完,會再向檔案描述符中寫入乙個佔位符,那麼下乙個迴圈才能進入後台執行,從而控制了併發的數量。

參考:

Shell多執行緒執行指令碼示例

shell指令碼是順序執行的,但是系統允許多個shell指令碼同時執行,為了達到資源的綜合利用,也就是把伺服器往死裡用,有時候需要一段指令碼對多個指令碼進行多執行緒的排程,並且等待完成之後繼續執行後續的指令碼。主指令碼 bin bash 用於識別子執行緒的完成數量 rm test.count tou...

多執行緒示例

include include include pthread t thread 2 pthread mutex t mut int num 0 void thread1 void args pthread exit null void thread2 void args pthread exit ...

多執行緒簡單示例。。。

插入兩個list box,分別為 idc list1 和 idc list2 再插入乙個按鈕,為 idc button1 caption為 run 效果圖如下 雙擊 run 按鈕,新建 onbtnrun 函式。如下 void cmultthreadsdlg onbtnrun 在cmultthread...