我很清楚,這不是一個問題,而是更多的討論,但我相信可以提供一個或多個答案,所以在這裏。std:mutex'es作爲將進入容器的對象的成員?
我有像這樣
class MyAwesomeObject {
public:
std::mutex theListMutex;
std::list<int> theList;
};
類現在,我相信意圖是比較明顯的,並且例子是故意的學術 - 雖然不是從我的現實遠 - 所以讓我們先走一步。然後我的應用程序處理大量這樣的對象,所有這些對象都存儲在其他地方的矢量中,並且一切都很好。麻煩從我編譯開始。我使用VS2012但我相信其他的編譯器可能會發出類似的錯誤:
error C2248: 'std::mutex::mutex' : cannot access private member declared in class 'std::mutex'
1> c:\program files\microsoft visual studio 11.0\vc\include\mutex(116) : see declaration of 'std::mutex::mutex'
1> c:\program files\microsoft visual studio 11.0\vc\include\mutex(107) : see declaration of 'std::mutex'
1> This diagnostic occurred in the compiler generated function 'MyApp::MyAwesomeObject ::MyAwesomeObject (const MyApp::MyAwesomeObject &)'
這意思很清楚,我通過很多其他的問題,在經歷在這裏SO,所有這些基本上可以說,「互斥體可以不會被複制「,我很好。所以我到目前爲止的策略是使互斥鎖shared_ptr<mutex>
並與它做到。唯一的「缺點」是,現在當我訪問互斥鎖時,我必須使用愚蠢的解引用語法,這當然不是愚蠢的,只是在我使用的所有其他點符號之間有點尷尬和突出這個地方。
現在,在我的問題:使用共享指針解決問題的正確方法?可能我使用了一個唯一的指針,因爲據我所知,我沒有將所有權轉讓給其他任何人(除非在對象成員的指針上調用方法實際上是一種所有權轉移的形式)?還有其他方法可以解決無法複製互斥鎖的事實嗎?
你在做什麼創造了這個錯誤?互斥量不應該永遠需要被複制。如果您處於這種情況,您的設計需要審查。 –
我有一個這樣的對象的向量,並且這個向量由它自己的互斥體保護。正如您所看到的,MyAwesomeObject類的每個對象都包含一個需要使用互斥鎖保護的列表。現在,我的應用程序需要隨機訪問所述矢量,挑選其中一個對象,訪問其列表,在其上執行一些操作,以及對象,然後將對象存儲回來。此外,我還使用基於範圍的循環訪問矢量,我認爲使用的引用不應該創建副本,但我已經完成了一些測試並且似乎發生了一些複製。 – Morpheu5
使它成爲'shared_ptr'的向量,它允許您在對象中擁有不可複製的互斥體。不要去分享互斥,那是壞的。 –