2013-06-26 123 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欢迎您!顺便说一句,既然你正在学习,我必须说,你的命名风格有点混乱。通常,类名称是大写字母,即“对象”,而变量名称不是,即“对象”。 –