2012-07-04 14 views
0

我有一個class A函數void runThread()來調用新線程。這是我A.cppstruct SendInfo和功能void thread(...)不包含在頭文件A.h在C++頭文件的cpp文件中啓動線程<process.h>

//A.cpp 
struct SendInfo{ 
    int a; 
    std::string mess; 
    SendInfo(int _a, std::string _mess){ 
     a = _a; 
     mess = _mess; 
    } 
}; 

void thread(SendInfo* args){ 
    std::cout << args->mess << std::endl; // Result here is nothing :-? 
} 

void A::runThread(){ 
    SendInfo info(10,"dump_string"); 
    std::cout << info.mess << std::endl; // Result here is "dump_string" 
    _beginthread((void(*)(void*))thread, 0, &info); 
} 

當主函數,我調用A objectrunThread()info.mess結果是好的,但args->mess沒有字符串。那麼我的問題是什麼?以及如何解決它?

+2

SendInfo分配在堆棧上,但是你發送一個指向_beginthread的指針,緊接着堆棧被展開一級。錯字或致命錯誤? – Max

+0

這是一個錯誤:D!謝謝! –

回答

4

您正在使用本地變量info;只要runThread退出,該變量超出了範圍,並且您不能再訪問它,即使是從其他線程訪問它。

您需要確保info具有延伸直到你thread函數結束一生(或至少,直到你在thread訪問它最後一次)。

0

Phillip Kendall說了些什麼,另外,當你做出改變時,要警惕安全防護 - 不要只是將info全球化,封裝在A中。