1. 程式人生 > >C#Job System如何工作(4)-C#Job System中的安全系統

C#Job System如何工作(4)-C#Job System中的安全系統

競爭條件

編寫多執行緒程式碼時,總是存在競爭條件的風險。當一個操作的輸出取決於其控制之外的另一個過程的時間的時候,就會發生競爭條件。

競爭條件並不總是一個Bug,但它是不確定行為的來源。當競爭條件確實導致Bug時,可能很難找到問題的根源,因為它取決於時間,因此您只能在極少數情況下重新復現問題。除錯它可能會導致問題消失,因為斷點和日誌記錄(Logging)可以改變單個執行緒的時間。競爭條件是編寫多執行緒程式碼時最重大的挑戰。

安全系統

為了更容易編寫多執行緒程式碼,Unity C#作業系統可以檢測所有潛在的競爭條件,並保護您免受可能導致的Bug的影響。

例如:如果C#Job System將主執行緒中程式碼中的資料引用傳送到Job中,則無法驗證主執行緒是否在作業寫入資料的同時讀取資料。這種情況就會建立競爭條件。

C#Job System通過向每個作業傳送它需要操作的資料的拷貝副本來解決這個問題,而不是對主執行緒中的資料的引用。這種拷貝副本隔離資料,從而消除競爭條件。

C#Job System複製資料的方式意味著作業只能訪問blittable資料型別。在託管程式碼和本機程式碼之間傳遞時,這些型別不需要轉換。

C#Job System可以使用memcpy複製blittable型別,並在Unity的託管和本機部分之間傳輸資料。它在排程Job時用memcpy將資料放入本機記憶體,並在執行作業時為託管端提供對該拷貝副本的訪問許可權。有關更多資訊,請參閱計劃作業。