2013-07-06 87 views
1

我知道兩個線程是否正在寫入同一個地方我需要確保它們以安全的方式執行並且不會造成任何問題,但如果只有一個線程讀取並完成所有寫入而另一個剛剛讀。只有一個線程正在寫入時的線程安全

在我的情況下,我第一次在小遊戲中使用了一個線程來保持渲染的獨立性。完成所有渲染的類將永遠不會寫入它讀取的任何內容,所以我不再確定是否需要處理每個讀取和寫入它們共享的所有內容。

我會採取正確的步驟來確保渲染器不會嘗試讀取任何不再存在的內容,但在調用像播放器和實體的getters那樣的東西時,我是否應該以相同的方式對待它們?或者將像x,y線和布爾值這樣的值設置爲「活着」來進行波動操作?

我的理解已成爲這個非常陰暗,可能有一些啓發

編輯做的:共享的數據將是任何需要繪製和移動,並存儲在對象的列表。 例如玩家和其他實體;

+0

不知道,但我想你只是需要確保讀者線程有最新的信息。看看'volatile'關鍵字。 – Leri

+0

什麼是共享數據?數組?對象列表? – morgano

+0

任何需要繪製和移動的東西都將被共享,並且是對象列表 –

回答

2

使用給定的信息,不可能準確地指定解決方案,但很明顯,您需要某種方法來在線程之間進行同步。問題是,只要寫操作不是原子,那麼您可能正在讀取正在更新的數據。這意味着你可以用一個新的x座標獲得一箇舊的y座標。

基本上你不僅不需要擔心同步,如果兩個線程都只有閱讀的信息或 - 更好 - 如果所有的數據結構是不變的(這樣兩個線程無法修改的對象)。繼續進行的最好方法是考慮哪些操作需要先進行原子操作,然後創建一個解決方案以使操作成爲原子操作。

不要忘記:讓它工作,讓它正確,讓它優化(按此順序)。

+0

您的權利,現在渲染器只需要知道線和幾個布爾值來檢查它是否應該渲染。如果我努力安全地分享這些信息,其餘部分在我走的時候會更有意義。先生非常感謝您 –

0

你可以在這種情況下的問題,如果列表的大小是可變的,你不同步對它們的訪問,這樣考慮:

  • 只讀線程讀取mySharedList大小和它認爲它是15;在那一刻,它的CPU時間完成與讀寫線程被賦予CPU
  • 讀寫線程從列表中刪除的元素,現在它的尺寸爲14
  • 只讀線程再次授予CPU時間,它嘗試使用在被中斷之前讀取的(現在已過時的)大小讀取最後一個元素,則會出現異常。