多工 同步

2021-07-05 11:47:40 字數 1415 閱讀 9248

實現多工之間通訊的最簡便的辦法是使用共享的資料結構。雖然共享資料區簡化了任務間的通訊,但是必須保證 每個任務在處理共享資料時的排他性。以避免競爭和資料破壞。共享資源滿足互斥性的一般方法有:

1.關中斷,開中斷

2.使用測試並置位指令

3.禁止做任務切換

4.利用訊號量

一.關中斷&開中斷

這估計是最簡單的方法了,**如下所示。

void function

(void)

注意:關中斷的時間不能太長,因為它將影響整個系統的中斷響應時間(中斷延遲時間)。如果僅僅是做為幾個變數賦值或者複製幾個變數,可以考慮使用這種方法。一般來說:關中斷的最長時間不能超過系統本身的關中斷時間。

二:測試並置位操作

即放乙個類似於標誌位的變數,如果該變數為0,則允許和共享資源互動,而為1則不允許。為防止另一任務也要使用該資源,只需把改標誌位置1.注意:這裡的標誌一般是一條不會被處理器中斷的指令。否則應在程式中關中斷對該標誌位操作,然後再開中斷。

這種指令被稱作tas(test and set)指令,在某些處理器中有硬體tas指令。

三:禁止,然後允許任務切換

給任務上鎖然後開鎖 (具體見其它文) 例:

void function

(void)

四:訊號量

訊號量的本質是一種約定機制。其用於:

1.控制共享資源的使用權

2.標誌某事件的發生

3.使兩個任務的行為同步

訊號量是任務得以執行的「鑰匙」,要執行,必須先拿到「鑰匙」。如果訊號量被別的任務占用,則該任務掛起,直到訊號量被當前的使用者釋放。對訊號量的操作有三種,初始化(inittialize)或者 建立 (creat);等待訊號 (wait)或者掛起 (pend);給訊號(signal)或者發訊號(post)。訊號量初始化時要給訊號量賦初值,等待訊號的任務列表應清空。

任務要得到訊號量必須:等待(wait),如果訊號量有效(大於0),訊號量-1任務得以執行。如果訊號量為0,任務列入等待訊號量任務列表,多數核心支援定義超時。如果等待時間超過了某乙個值,該訊號量是還無效的,則等待訊號量的任務進入就緒狀態。準備執行,並返回錯誤**(指出發生超時錯誤)。

任務以發訊號的方式釋放訊號量,如果沒有任務等待訊號量。訊號量只是簡單的加1.如果有任務等待該訊號量,訊號量的值就不加1.於是「鑰匙」給了等待訊號量的任務中的乙個。至於任務的選擇要看核心是如何排程的:

1.等待訊號量的任務中優先順序最高的

2.最早等待訊號量的任務(fifo)ucos ii只支援優先順序法。

例:os_event *sharedatasem;

void function

(void)

當多個任務共享輸入輸出裝置時,訊號量很有用。

但要注意:訊號量不能用過頭,處理很簡單的資料共享都用訊號量,訊號量的建立和釋放都是要花很多時間的。這種額外的負荷是不必要的。

Python 多工 執行緒同步

高階程式設計技巧 學習筆記 1.1 實現兩個執行緒一問一答 class xiaoai threading.thread def init self super init name 小艾同學 def run self print f 在 print f 你猜現在幾點了?class tianmao th...

Linux 多工程式設計 多工的同步與互斥

現代作業系統基本都是多工作業系統,即同時有大量可排程實體在執行。在多工作業系統中,同時執行的多個任務可能 這兩種情形是多工程式設計中遇到的最基本的問題,也是多工程式設計中的核心問題,同步和互斥就是用於解決這兩個問題的。互斥 是指散步在不同任務之間的若干程式片斷,當某個任務執行其中乙個程式片段時,其它...

多工的同步與互斥

現代作業系統基本都是多工作業系統,即同時有大量可排程實體在執行。在多工作業系統中,同時執行的多個任務可能 這兩種情形是多工程式設計中遇到的最基本的問題,也是多工程式設計中的核心問題,同步和互斥就是用於解決這兩個問題的。互斥 是指散步在不同任務之間的若干程式片斷,當某個任務執行其中乙個程式片段時,其它...