我有一個C++進程初始化一個類存儲在一個std::map
一些數據,然後另一個類 - 將在一個線程中執行 - 我通過一個指針(我也試過參考),因爲它需要訪問std::map
(使用getter)的內容。從線程訪問對象(使用引用或指針)
發生的事情是,當我從主線程更新第一類的std::map
時,從未更新過第一類的數據。
我的問題是我的問題導致我使用線程,以便該對象被複制,然後不會收到更新? 以及如何解決這個問題?
謝謝
我有一個C++進程初始化一個類存儲在一個std::map
一些數據,然後另一個類 - 將在一個線程中執行 - 我通過一個指針(我也試過參考),因爲它需要訪問std::map
(使用getter)的內容。從線程訪問對象(使用引用或指針)
發生的事情是,當我從主線程更新第一類的std::map
時,從未更新過第一類的數據。
我的問題是我的問題導致我使用線程,以便該對象被複制,然後不會收到更新? 以及如何解決這個問題?
謝謝
沒有,std::map
是一個普通的容器中,並沒有任何與線程。很有可能你的線程之間存在同步問題,例如一個線程在之前查看地圖的競爭條件,或者與另一個線程更新地圖的同時發生同步問題。奇怪的事情可能發生在這些情況下,因爲std::map
可能會更改很多內部指針,以便在添加,更改或刪除某些內容時重新平衡樹。另一個線程同時查看地圖可能會「困惑」。
嘗試從任一線程訪問映射時使用信號量或互斥鎖,並查看是否能解決您的問題。
請不要使用信號燈!使用std :: mutex。有一個原因是C++ 11委員會沒有包含std :: semaphore。信號量「太靈活」,因此難以推斷正確性(對人類和工具都是如此)。 – 2013-04-23 20:27:11
首先感謝大家的意見(甚至沒有幫助的意見)。
我終於找到了我遇到的問題。 我正在使用升壓信號來更新包含std::map
的類,並且正在通過我的類實例化而不使用&
,因此正在處理副本。
你不能「初始化一個班級」。你只能初始化* objects *。 – 2013-04-23 19:37:52
你真的需要發佈一些代碼。我們不知道你是通過複製還是通過引用傳遞,你是如何創建你的線程等 – maditya 2013-04-23 19:40:13
而且你也不能執行一個類(即使有時我希望我可以執行一些庫設計師^ _ ^)。 – syam 2013-04-23 19:40:34