2013-06-26 182 views
1

大家上午,故障與線程

我試圖創建一個線程,這將根本改變對象的變量的值,然後打印屏幕上的一個非常簡單的應用。所以現在每當我運行程序時,線程都會被正確初始化,但是它會返回object->a的一些垃圾值。

您能否給我一些關於如何讓這個工作的指針?

非常感謝。 亞歷

HANDLE hPrintMutex; 
int ThreadNr; 

class object 
{ 
    public: 
     int a; 
     object(void); 
}; 

object::object(void) 
{ 
    a=1; 
} 


void printNumber(void * arg) 
{ 
    object * x=(object*) arg; 
    std::cout<<"Thread1 -> "<< x->a<<"\n";; 
    while(x->a<10) 
    { 
     WaitForSingleObject(hPrintMutex,INFINITE); 
     x->a=5; 
     ReleaseMutex(hPrintMutex); 
    } 
} 

int main() 
{ 
    object * Object; 
    Object = new object; 

    hPrintMutex=CreateMutex(NULL,false,NULL); 
    std::cout << "Main -> "<<Object->a<<"\n"; 

    HANDLE hThread1=(HANDLE)_beginthread(printNumber,0,&Object); 

    WaitForSingleObject(hThread1,INFINITE); 
    return 0; 
} 
+0

有沒有使用任何特殊的理由std ::線程,std :: mutex甚至std :: atomic? – PlasmaHH

+0

沒理由,我只是找不到任何更好的示例來研究C++線程。所有其他例子似乎很難理解。 – Wracker

+1

@Wracker我相信這是Windows API,所以他們不能被稱爲C++線程。看看[std :: thread](http://en.cppreference.com/w/cpp/thread/thread/thread),這是現在執行線程的新的「正確」方法 –

回答

3

你傳入object **的線程,但將其視爲object *

你不需要&

HANDLE hThread1=(HANDLE)_beginthread(printNumber,0,&Object); 
               ^
+0

ohh先生你的天才:) ..謝謝! – Wracker

+0

@Wracker歡迎您!順便說一句,既然你正在學習,我必須說,你的命名風格有點混亂。通常,類名稱是大寫字母,即「對象」,而變量名稱不是,即「對象」。 –