? ? ? ? 事件集是線程間同步的機制之一,一個事件集可以包含多個事件,利用事件集可以完成一對多、多對多的線程間同步。
目錄
一、事件集舉例說明
二、事件集工作機制
三、RT-Thread為實例說明
四、事件集的應用場合
一、事件集舉例說明
以坐公交車為例:
? ? ? ? ①P1坐公交去某地,只有一個公交可以到達目的地,等到該公交即可出發。
? ? ? ? ②P1坐公交去某地,有三種公交都可以到達目的地,等到其中任意一輛即刻出發。
? ? ? ? ③P1約另一個人P2去某地視為線程,將“公交到達公交站”、“同伴P2到達公交站”視為事件的發生,情況①是特定事件環喚醒線程;情況②是任意單個事件喚醒線程;情況③是多個事件同時發生才喚醒線程。
二、事件集工作機制
? ? ? ? 事件集主要用于線程間的同步,與信號量不同,它的特點是可以實現一對多,多對多的同步。即一個線程與多個的關系可設置為:其中任意一個事件喚醒線程,或幾個事件都到達后才喚醒線程進行后續的處理;同樣,事件也可以是多個線程同步多個事件。這種多個事件的集合可以用一個32位無符號整型變量來表示,變量的每一位代表一個事件,線程通過“邏輯與”或“邏輯或”將一個或多個事件關聯起來,形成事件組合。事件的“邏輯或”也稱為是獨立型同步,指的是線程與任何事件之一發生同步;事件“邏輯與”也稱為是關聯型同步,指的是線程與若干事件都發生同步。
三、RT-Thread為實例說明
? ? ? ? 1)事件只與線程相關,事件間相互獨立:每個線程可擁有32個事件標志,采用一個32bit無符號整型數進行記錄,每個bit代表一個事件;
? ? ? ? 2)事件僅用于同步,不提供數據傳輸功能;
? ? ? ? 3)事件無排隊性,即多次向線程發送同一事件(如果線程還未來得及讀的走),其效果等同于只發送一次。
? ? ? ? 在RT-Thread中,每個線程都擁有一個事件信息標記,它有三個屬性,分別是“與“、”或“和”清除標記”。當線程等待事件同步時,可以通過32個事件標志和這個事件信息標記來判斷當前接收的事件是否滿足同步條件。
? ? ? ? 如圖所示,線程#1的事件標志中第1位和第30位被置位,如果事件信息標記位設為邏輯與,則表示線程#1只有在事件1和事件30都發生以后才會被觸發喚醒,如果事件信息標記位設為邏輯或,則事件1或事件30中的任意一個發生都會觸發喚醒線程#1。如果信息標記同時設置了清除標記位,則當線程#1喚醒后將主動把事件1和事件30清零,否則事件標志將依然存在(即置1)。
四、事件集的應用場合
? ? ? ? 事件集可適用于多種場合,它能夠在一定程度上替代信號量,用于線程間同步。一個線程或中斷服務例程發送一個事件給事件集對象,而后等待的線程被喚醒并對相應的事件進行處理。但是它與信號量不同的是,事件的發哦是那個操作在事件未清除前是不可累計的,而信號量的釋放動作是累計的。事件的另一個特性是,接收線程可等待多種事件,即多個事件對應一個線程或多個線程。同時按照線程等待的參數,可選擇是“邏輯與”還是“邏輯或”觸發。這個特性也是信號量等所不具備的,信號量只能識別單一的釋放動作,而不能同時等待多種類型的釋放。
? ? ? ? 如圖所示,一個事件集包含32個事件集,特定線程只等待、接收它關注的事件。可以是一個線程等待多個事件的到來(線程1、2均等待多個事件,事件間可以使用“與”“或”邏輯觸發線程),也可以是多個線程等待一個事
件的到來(事件25)。當有它們關注的事件發生時,線程將被喚醒并進行后續的處理動作。