在
uj5u.com熱心網友回復:
在多核甚至單核搶占式作業系統上,您無法真正按照嚴格的時間順序將訊息送入佇列。即使您使用互斥鎖來同步對佇列的寫訪問,一旦多個寫入者在互斥鎖上等待并且互斥鎖變得空閑,就不再保證嚴格的順序。充其量,等待寫入執行緒獲取互斥鎖的順序取決于實作(取決于作業系統代碼),但最好假設它只是隨機的。
話雖如此,嚴格的時間順序首先是定義問題。為了解釋這一點,假設您的 PC 有一些數字輸出位(每個寫入執行緒 1 個),并且您將邏輯分析儀連接到這些位....想象一下,您在代碼中選擇了某個位置,在其中切換相應的位在您的入隊功能中。即使該位切換僅在獲取互斥鎖之前發生了一條匯編指令,也有可能在撰寫器代碼接近該點時順序已更改。您也可以事先將其設定為其他任意點(例如,當您進入入隊功能時)。但是,同樣的推理也適用。因此,嚴格的時間順序本身就是一個定義問題。
有一個案例類比,其中 CPU 中斷控制器有多個輸入,并且您嘗試構建一個系統來嚴格按時間順序處理這些中斷。即使所有中斷輸入都在同一時刻發出信號(一個開關,同時將它們全部拉到信號狀態),也會發生一些順序(例如由硬體邏輯或僅由輸入引腳上的噪聲或系統中斷調度程式功能引起(某些 CPU(例如 MIPS 4102)具有單個中斷向量,匯編代碼檢查可能的中斷源并分派到專用的中斷處理程式)。
這個類比有助于了解模式:它歸結為同步系統上的異步輸入。這本身就是一個眾所周知的難題。
因此,您可能做的最好的事情就是為您的應用程式“嚴格排序”做出合適的定義并接受它。
然后,為了避免違反您的定義,您可以使用優先級佇列而不是普通的 FIFO 資料型別,并使用一些原子計數器作為優先級:
- 在代碼中您選擇的位置,以原子方式讀取并遞增計數器。這是您的訊息序列號。
- 使用您的序列號作為優先級,組裝您的訊息并將其排入優先級佇列。
另一種可能的方法是定義“同時”的概念,它可以在佇列的另一端檢測到(因此,讀者不能假設一組“同時”訊息的嚴格排序)。這可以通過讀取一些高頻滴答計數來實作,并且所有那些具有相同“時間戳”的訊息在閱讀器端被認為是同時的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/424586.html
下一篇:用燒瓶中的路由控制守護執行緒
