RTOS多執行緒同步問題

2021-09-25 22:15:20 字數 1257 閱讀 2120

在多執行緒程式設計中,完成乙個工作通常需要多個執行緒協同完成,其中會涉及到多個執行緒訪問同一資源(共享記憶體)。

例如一項工作中的兩個執行緒:乙個執行緒從感測器中接收資料並且將資料寫到共享記憶體中,同時另乙個執行緒週期性的從共享記憶體中讀取資料並傳送去顯示,下圖描述了兩個執行緒間的資料傳遞:

如果對共享記憶體的訪問不是排他性的,那麼各個執行緒間可能同時訪問它,這將引起資料一致性的問題。例如,在顯示執行緒thread1試圖顯示資料之前,接收執行緒thread2還未完成資料的寫入,那麼顯示將包含不同時間取樣的資料,造成顯示資料的錯亂。

將感測器資料寫入到共享記憶體塊的接收執行緒thread1和將感測器資料從共享記憶體塊中讀出的執行緒thread2都會訪問同一塊記憶體。為了防止出現資料的差錯,兩個執行緒訪問的動作必須是互斥進行的,應該是在乙個執行緒對共享記憶體塊操作完成後,才允許另乙個執行緒去操作,這樣,接收執行緒 thread1與顯示執行緒 thread2 才能正常配合,使此項工作正確地執行。

執行緒的同步方式有很多種,其核心思想都是:在訪問臨界區的時候只允許乙個 (或一類) 執行緒執行。進入 / 退出臨界區的方式有很多種:

1、臨界區保護函式(採用關中斷實現)

2、任務排程鎖(採用禁止排程函式實現)

3、計數訊號量(有可能造成優先順序反轉問題)

4、互斥量(可以防止優先順序反轉問題)

5、事件標誌組

與計數訊號量相關的核心api大致有三個初始化訊號量等待訊號量通知訊號量可用

1、初始化訊號量:初始化訊號量的值

2、等待訊號量

判斷訊號量的值是否大於0?

y:資源可用,計數訊號量的值減一。

n:資源不可用,將當前執行緒插入訊號量事件佇列後,掛起該任務,等待通知。

若設定超時時間,當到達超時時間時,返回該執行緒。

3、通知訊號量可以使用

訊號量事件佇列中是否有等待任務?

y:喚醒該等待任務,加入就緒表;若該任務優先順序高於當前任務,則立即切換過去。

n:計數訊號量加一;

多執行緒同步問題

在應用程式中使用多個執行緒的乙個好處是每個執行緒都可以非同步執行。對於 windows 應用程式,耗時的任務可以在後台執行,而使應用程式視窗和控制項保持響應。對於伺服器應用程式,多執行緒處理提供了用不同執行緒處理每個傳入請求的能力。否則,在完全滿足前乙個請求之前,將無法處理每個新請求。然而,執行緒的...

多執行緒同步問題

有四個執行緒1,2,3,4,執行緒1的功能就是輸出1,執行緒2的功能就是輸出2,以此類推.現在有四個檔案.abcd.初始都為空.現要讓四個檔案呈如下格式 a 1 2 3 4 1 2.b 2 3 4 1 2 3.c 3 4 1 2 3 4.d 4 1 2 3 4 1.設計程式.include sys ...

多執行緒 同步問題

我們先看個錯誤示例。功能 宣告乙個數字並賦值10000.然後讓1w個執行緒去減少1,1w個執行緒去增加1。理論上說,加一萬減一萬,最後數字的結果並不會改變。class errordemo 釋放object的方法 synchronized 塊結束或者異常丟擲。使用synchronized後的 publ...