2017-02-10 40 views
-1

我非常困惑,因爲一個變量(燃料)變成0「自己」,我敢肯定這不是真的,因爲電腦不是神奇的生物。但是,我一直檢查變量的使用情況,並沒有出現任何奇怪的現象。但是,當它是從一個線程到另一個線程。下面是一些一塊代碼:包含多線程的程序中的C++變量值「自身」

在主

dataCollectorFTL dataCollector1; 
... 
expertModule expertModule1(dataCollector1, gazeCoordinate1, communicationModule1); 

在expertModule .H:

public: 

dataCollectorFTL& theDataCollector; 
communicationModule& theCommunicationModule; 

...

std::chrono::steady_clock::time_point lastRefresh; 
bool isFighting; 
int previousEnemyHull; 
long fuel; 

...

expertModule::expertModule(dataCollectorFTL &aDataCollectorFTL, gazeCoordinate &aGazeCoordinate, communicationModule &aCommunicationModule); 

然後,在expertModule.cpp:

expertModule::expertModule(dataCollectorFTL &aDataCollectorFTL, gazeCoordinate &aGazeCoordinate, communicationModule &aCommunicationModule) : theDataCollector(aDataCollectorFTL) , theGazeCoordinate(aGazeCoordinate) , theCommunicationModule(aCommunicationModule) { 

    isFighting = false; 
    lastRefresh = std::chrono::steady_clock::now(); 
    fuel = theDataCollector.dataFuel; 

} 

...

if (std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now()-lastRefresh).count()>500){ 

    if (isFighting && (expertModule::fuel =! theDataCollector.dataFuel || theDataCollector.dataEnemyHull == 0)){ 
     isFighting = false; 
     previousEnemyHull = theDataCollector.dataEnemyHull; 
    } else if (!isFighting && theDataCollector.dataEnemyHull != previousEnemyHull) { 
     isFighting = true;  
     expertModule::fuel = theDataCollector.dataFuel; 
    } 


    std::cout<<expertModule::fuel<<std::endl; 
    std::cout<<theDataCollector.dataFuel<<std::endl;   
    lastRefresh = std::chrono::steady_clock::now(); 
} 

有了這個代碼,該expertModule變量 「燃料」 值得初始化時的精確值,然後進入爲0而DataCollector.dataFuel不更改。

謝謝你的幫助

+0

歡迎來到Stack Overflow。請花些時間閱讀[The Tour](http://stackoverflow.com/tour),並參閱[幫助中心](http://stackoverflow.com/help/asking)中的資料,瞭解您可以在這裏問。 –

+0

這聽起來像一個調試器的工作(也許是valgrind) – Jonas

+0

一個常見的混淆之處是,你在某處(如在構造函數中)創建數據的副本,並且所有更新都會轉到副本。然後令人驚訝的是,原文沒有改變。只是一個猜測。 –

回答

0

我只能給你建議如何調試這個。一個也改進了你的設計的選擇是使變量私人化並引入一個設置器setFuel。每次調用setter時,都可以打印變量或包含斷言。我想你可以很快找到這個錯誤。