线程没有被破坏

时间:2013-07-17 05:25:42

标签: c++ multithreading visual-studio-2010 thread-synchronization

我正在研究多线程系统,这是我的代码 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");
   }
}

2 个答案:

答案 0 :(得分:2)

否 - 关闭线程的句柄不会破坏线程本身。线程应该退出(通过调用ExitThread或者只是从线程函数返回)完成它的工作。

在紧急情况下,你可以使用TerminateThread来杀死一个线程,但这应该保留用于真正的紧急情况 - 它可以使进程处于不稳定状态,所以它通常应该要避免,如果你必须使用它,你可能希望尽快关闭这个过程。

另请注意,在使用标准库的程序中,直接使用CreateThread并不安全 - 您应该拨打_beginthread_beginthreadex。这些设置允许线程安全地使用使用静态存储的标准库函数(例如strtokmktime,但还有更多)。

答案 1 :(得分:2)

删除所有那些“(type)foo”强制转换,它们强制编译器接受实际上不适合的东西。你必须通过用适当的类型替换东西来解决一些错误。对于传递给线程的上下文指针,从demo*void*的转换是隐式的。正确的强制转换为static_cast<demo*>(data)。如果需要,也可以使用静态强制转换进行隐式转换。函数中也缺少返回值,唯一允许的情况是main()。我提到的原因是,正式地说,任何事情都可能发生在您的程序中,因为这些事情会导致不确定的行为。

然后,您输出“inst of value”但实际输出称为“inst”的局部变量的地址,这是不同的。这可能只会增加你的困惑。

现在,遇到问题,CloseHandle()不会停止线程。它只释放你的手柄。你想要的是WaitForSingleObject()或其中一个兄弟。