[英]QThread: Destroyed while thread is still running and QMutex destroyed
[英]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
。 這些設置允許線程安全地使用使用靜態存儲的標准庫函數(例如, strtok
和mktime
,但還有更多)。
刪除所有那些“(類型)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.