簡體   English   中英

我是否應該在一個線程中鎖定一個變量,如果我只需要在其他線程中使用它的值,為什么它不工作呢?

[英]Should I lock a variable in one thread if I only need it's value in other threads, and why does it work if I don't?

我知道這個問題 ,但我相信我的擔憂是非常不同的。

我最近使用線程和OpenGL創建了一個SDL應用程序。 我有一個線程在循環中運行,它不斷更新我繪制到屏幕的對象的狀態。 狀態非常簡單,它只是一個布爾數組(當數組值為true時,我繪制它,當它為假時,我沒有)。

目前,我的任何變量都沒有互斥鎖,一切正常。 即使只有一半的狀態數組在繪制之間更新,幀速率也要高得多(或至少等於)更新速率,因此具有半更新狀態是可以接受的。

現在,我最初在使用中斷的嵌入式系統上開始研究類似的想法。 每隔一段時間,一個中斷就會觸發,更新狀態數組,執行將繼續。 現在,我是一個多核桌面上,並同時更新數組,我不知道為什么沒有什么不好的正在發生的事情,因為我在技術上閱讀並同時寫入同一個存儲單元。

  • 這只是偶然的,還是有理由沒有發生內存訪問違規?
  • 如果在使用該值之前,期間或之后變量的狀態是可以接受的,那么我是否應該使用互斥鎖?

謝謝您的幫助。


編輯:附加信息 - 數組是動態創建的,但是當它被創建/刪除時,我確實使用了互斥鎖(我認為訪問已刪除的內存不會看起來很友善:P)。

理論上,在沒有某些同步的情況下訪問這樣的內存是完全無效的(未定義的行為)。

在實踐中,只要符合以下條件,它就是中等安全的:

  1. 只有一個線程在寫,其他線程都在讀。
  2. 如果讀者在一段時間之后沒有看到一些變化(可能比他們寫入的實際時間得多),你不在乎。
  3. 您不關心讀者是否看到無序更改,即他們會看到稍后進行的某些更改,而不會看到之前進行的其他更改。

問題2和3在x86上不是問題,但幾乎可以在所有其他真實世界的多核/ SMP機器上發生。 您可以使用某些特定於機器的asm(或編譯器內在函數)來緩解它們,以在適當的位置插入內存屏障

布爾數組元素可以通過原子操作設置/讀取,不需要互斥鎖。 您需要一個互斥鎖來保護結構,以確保它保持一致。 由於你的布爾是獨立的,所以沒有問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM