2010-02-26 15 views
2

當我試圖把一個遊戲引擎的動畫更新功能和物理模擬成執行一個單獨的線程中,我悟出了一些浮點值的潛在競爭條件(比如,物體的位置)寫線程之間(動畫,物理)和讀者線程(渲染器),如果兩個線程都要同時訪問這些值。忽略平滑變化浮點值的讀寫競爭條件是否安全?

我的問題是,因爲即使是浮點賦值不是原子,會出現這樣的讀寫競爭條件可能會導致原有的平滑變化的值的有線/突然改變被讀者所看到?

而且,在我的情況,我可以容忍少量錯誤的,因爲這樣的錯誤不會累積在接下來的渲染幀。

+0

我會建議指定您的平臺和語言,因爲我們無法對浮點表示做任何保證而不知道這些。 – Kylotan 2010-02-26 10:04:18

回答

0

從理論上說,你可以得到錯誤的一個巨大的程度,如果有更新指數和更新尾數之間的上下文切換,但我懷疑大多數平臺或目前使用的體系結構允許這樣的事情發生。

+0

你只是談論多個線程之間的一個CPU情況'上下文切換'。在像PC或xbox360這樣的共享內存體系結構中,不同CPU上的多個線程可以同時訪問相同的內存。 – 2010-03-08 00:59:37

+0

我正在談論任何現代化的平臺。如果可以在物理寫入過程中讀取浮點值,我會感到有些驚訝。我期望總線或緩存或* something *在該進程中被鎖定,以便指令正確完成。但任何一種方式的進一步證據都會有用。 – Kylotan 2010-03-08 17:22:05

1

爲了我的理解,只要你一次只寫在線程上,你不關心你的閱讀線程是否沒有使用最新版本。

從我的理解,寫的浮動應該是原子到你的代碼,雖然這可能是我認爲平臺相關的。

1

Section 12.5 of ECMA-334(C#語言specifcation)規定:

讀取和下面的數據 類型應是原子的寫:布爾,焦炭, 字節,爲sbyte,短,USHORT,UINT,INT, 浮動和引用類型。

爲此,你應該不會看到任何損壞,由於讀取和一個浮動的寫入(假設你不是說這裏兩倍,即保證是原子寫入)。

然而,應該注意的是,當值的寫入保證是原子,的順序讀/寫是,除非你使用特定的東西,喜歡Monitor.Enter通話保障。

Monitor.Enter是這個有點重了,所以我會建議在聲明變量時,使用volatile keyword。假設讀取/寫入這個變量是唯一需要發生的事情,它將保證讀取/寫入按順序完成。