1

我正在开发一个多线程系统,这是我的代码类演示在 .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");
   }
}
4

2 回答 2

2

不——关闭线程句柄不会破坏线程本身。线程完成工作后应该退出(通过调用ExitThread或仅从线程函数返回)。

在紧急情况下,您可以使用TerminateThread杀死线程,但这应该保留给真正的紧急情况——它会使进程处于不稳定状态,因此通常应该避免使用它,如果您必须使用它,您可能想要之后尽快关闭该过程。

另请注意,在使用标准库的程序中,直接使用并不安全CreateThread——您应该调用_beginthreador_beginthreadex代替。它们做了一些设置,以允许线程安全地使用使用静态存储的标准库函数(例如,strtokmktime,但还有很多)。

于 2013-07-17T05:34:41.730 回答
2

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

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

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

于 2013-07-17T05:35:39.580 回答