我正在研究多线程系统,这是我的代码 class demo在.h文件中定义
当第二次执行主函数的循环时,下面的COMMENT1采用前一个值
没有关闭句柄关闭线程吗?
int threadentry(void* data)
{
demo* inst=(demo*) data;
cout << "Value of inst "<<hex << &inst<< endl;
string request;
cin>>request;
if(request==play)
{
inst->play;
cout << "Value of inst "<<hex << &inst<< endl;
// COMMENT1 here when the thread is executed second time from the main it is taking previous value
}
}
int main()
{
while(1)
{
demo* inst=new demo();
cout << "Value of inst "<<hex << &inst<< endl; //value is coming different from above
HANDLE threads;
DWORD threadId1;
if ((threads = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadentry,
(void *)inst, 0, &threadId1)) == NULL)
return -1;
//here is some Processing of data and after processing I close the handle
CloseHandle(threads);
delete inst;
system("pause");
}
}
答案 0 :(得分:2)
否 - 关闭线程的句柄不会破坏线程本身。线程应该退出(通过调用ExitThread
或者只是从线程函数返回)完成它的工作。
在紧急情况下,你可以使用TerminateThread
来杀死一个线程,但这应该保留用于真正的紧急情况 - 它可以使进程处于不稳定状态,所以它通常应该要避免,如果你必须使用它,你可能希望尽快关闭这个过程。
另请注意,在使用标准库的程序中,直接使用CreateThread
并不安全 - 您应该拨打_beginthread
或_beginthreadex
。这些设置允许线程安全地使用使用静态存储的标准库函数(例如strtok
和mktime
,但还有更多)。
答案 1 :(得分:2)
删除所有那些“(type)foo”强制转换,它们强制编译器接受实际上不适合的东西。你必须通过用适当的类型替换东西来解决一些错误。对于传递给线程的上下文指针,从demo*
到void*
的转换是隐式的。正确的强制转换为static_cast<demo*>(data)
。如果需要,也可以使用静态强制转换进行隐式转换。函数中也缺少返回值,唯一允许的情况是main()。我提到的原因是,正式地说,任何事情都可能发生在您的程序中,因为这些事情会导致不确定的行为。
然后,您输出“inst of value”但实际输出称为“inst”的局部变量的地址,这是不同的。这可能只会增加你的困惑。
现在,遇到问题,CloseHandle()不会停止线程。它只释放你的手柄。你想要的是WaitForSingleObject()或其中一个兄弟。