簡體   English   中英

線程沒有被破壞

[英]Thread is not getting Destroyed

我正在研究多線程系統,我的代碼類演示在.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");
   }
}

否 - 關閉線程的句柄不會破壞線程本身。 線程應該在完成其工作時退出 (通過調用ExitThread或僅通過從線程函數返回)。

在緊急情況下,你可以使用TerminateThread殺死一個線程,但是應該為真正的緊急情況保留 - 它可以使進程處於不穩定狀態,所以通常應該避免,如果你必須使用它,你可能想要盡快關閉這個過程。

另請注意,在使用標准庫的程序中,直接使用CreateThread並不安全 - 您應該調用_beginthread_beginthreadex 這些設置允許線程安全地使用使用靜態存儲的標准庫函數(例如, strtokmktime ,但還有更多)。

刪除所有那些“(類型)foo”強制轉換,它們強制編譯器接受實際上不適合的東西。 你必須通過用適當的類型替換東西來解決一些錯誤。 對於傳遞給線程的上下文指針,從demo*void*的轉換是隱式的。 正確的static_cast<demo*>(data)static_cast<demo*>(data) 如果需要,也可以使用靜態強制轉換進行隱式轉換。 函數中也缺少返回值,唯一允許的情況是main()。 我提到的原因是,正式地說,任何事情都可能發生在您的程序中,因為這些事情會導致未定義的行為。

然后,您輸出“inst of value”但實際輸出稱為“inst”的局部變量的地址,這是不同的。 這可能只會增加您的困惑。

現在,遇到問題,CloseHandle()不會停止線程。 它只釋放你的手柄。 你想要的是WaitForSingleObject()或其中一個兄弟。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM