2012-10-15 265 views
4

我有一個數據結構有兩種訪問它的方法:query()和modify()。多個線程可以同時使用query(),但只有一個線程可以輸入modify(),同時所有使用query()的線程必須在modify()上進行訪問之前退出。多個讀取和單個寫入 - 線程安全?

什麼是使C++這個數據結構線程安全的最佳方式?

(我讀了升壓讀/寫鎖,但有人告訴我,這可能是比使用互斥3-40x慢)

+0

首先嚐試最簡單的辦法 - 保護所有與互斥訪問。 99.5%的時間,這將是令人滿意的,你的工作將完成。 (如果一個線程不可能嘗試修改該對象,而另一個線程正在或可能正在訪問它,則不需要鎖定。假設您的讀取不會以任何方式修改該對象。) –

+0

It取決於'modify'中發生了什麼。讀和寫部分的全部保護措施是在更改中途停止讀取無效。只保護'修改'功能不會實現這一點。但是,如果您只保護單個數據類型,例如int或指針,我相信這樣可以。不過,我想寫一個非常殘酷的測試程序來驗證。的 – paddy

+0

可能重複[我需要保護在多線程環境下讀取訪問一個STL容器?](http://stackoverflow.com/questions/187583/do-i-need-to-protect-read-access-to -an-STL-容器中-A-多線程-ENVIRON) –

回答

1

一般來說,你應該保護共享數據使用互斥。

但如果你鍵入共享數據是整數,你還可以考慮使用std::atomic,這通常比鎖定一個互斥體快得多。