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...