2013-04-23 66 views
0

我有一個C++進程初始化一個類存儲在一個std::map一些數據,然後另一個類 - 將在一個線程中執行 - 我通過一個指針(我也試過參考),因爲它需要訪問std::map(使用getter)的內容。從線程訪問對象(使用引用或指針)

發生的事情是,當我從主線程更新第一類的std::map時,從未更新過第一類的數據。

我的問題是我的問題導致我使用線程,以便該對象被複制,然後不會收到更新? 以及如何解決這個問題?

謝謝

+1

你不能「初始化一個班級」。你只能初始化* objects *。 – 2013-04-23 19:37:52

+1

你真的需要發佈一些代碼。我們不知道你是通過複製還是通過引用傳遞,你是如何創建你的線程等 – maditya 2013-04-23 19:40:13

+2

而且你也不能執行一個類(即使有時我希望我可以執行一些庫設計師^ _ ^)。 – syam 2013-04-23 19:40:34

回答

2

沒有,std::map是一個普通的容器中,並沒有任何與線程。很有可能你的線程之間存在同步問題,例如一個線程在之前查看地圖的競爭條件,或者與另一個線程更新地圖的同時發生同步問題。奇怪的事情可能發生在這些情況下,因爲std::map可能會更改很多內部指針,以便在添加,更改或刪除某些內容時重新平衡樹。另一個線程同時查看地圖可能會「困惑」。

嘗試從任一線程訪問映射時使用信號量或互斥鎖,並查看是否能解決您的問題。

+0

請不要使用信號燈!使用std :: mutex。有一個原因是C++ 11委員會沒有包含std :: semaphore。信號量「太靈活」,因此難以推斷正確性(對人類和工具都是如此)。 – 2013-04-23 20:27:11

0

首先感謝大家的意見(甚至沒有幫助的意見)。

我終於找到了我遇到的問題。 我正在使用升壓信號來更新包含std::map的類,並且正在通過我的類實例化而不使用&,因此正在處理副本。