簡體   English   中英

直觀的線程安全

[英]Intuitive thread safety

在我的3D游戲項目中嘗試並發之后,我開始懷疑是否有可能以直觀,干凈和隱含的方式實現線程安全。 我不喜歡只是為了訪問資源而顯式鎖定/解鎖互斥鎖 - 我更傾向於一個完全隱藏在實際工作的代碼中的解決方案。 在C ++ 11中是否有允許這樣的設計模式或結構?

下面詳細說明我希望實現這種情況的具體示例。

第1類:具有共享資源( std::unordered_map ),它將std::shared_ptr保存到Class 3實例。 該類訪問這些共享資源。

第2類:有一個在它自己的線程中運行的函數。 此函數訪問Class 1中的共享資源(包括訪問Class 3實例)。

第3類:兩個線程都可以訪問此類的函數。 任何一個線程都可以讀/寫。

有什么建議么? 也許這里的真正問題更可能是我的設計使得線程安全不切實際?

並發模式和習語有一堆廢話。 無論多么通用,您都可以忘記所有同步與一個例外:不可變數據類型。 如果沒有任何東西寫入某個值,那么線程就不需要同步它們的訪問權限,因為如果有人在寫, 只能進行數據競爭。

這包括參考計數。 如果您在值類型中使用引用計數pimpl實現,則必須在構造和刪除時寫入引用計數。 大多數情況下,這是通過原子操作完成的,這些操作比互斥鎖或信號量更快,但可以帶來自己的問題。

有復制/修改/交換。 從不可變的共享值復制數據。 修改副本。 使用不可變值交換。 留意ABA問題。

傳遞消息而不是使用共享數據。

最后(正如我能想到的那樣)我們將共享值包裝到一個對象中,該對象通過一些代理魔術為您完成大部分同步操作。 Facebook在其愚蠢的lib中發布了一個: https//github.com/facebook/folly/blob/master/folly/docs/Synchronized.md這可能會簡化許多已經很簡單的問題,但並不是一個全面的答案。

暫無
暫無

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

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