[英]How to safely close a THREAD which has a infinite loop in it
我正在使用_beginthreadex
函數創建一個線程。 我傳入的函數地址有一個無限的 while 循環( while(1)
)。 我有threadid
和threadhandle
。
我可以使用TerminateThread(threadhandle,1);
但這是危險的。
安全的方法是使用_endthreadex
殺死線程,但它只能從線程內部使用,我想從外部殺死線程。
因此,請建議是否有一種安全的方法可以使用threadid
或threadhandle
從外部安全地關閉、結束或終止線程。
你應該- 從字面上看 -永遠不要使用TerminateThread() 。 我什至不是在開玩笑。 如果從外部終止一個線程,則其中保留的所有資源都會泄漏,內部訪問的所有狀態變量都將處於未確定狀態等等。
您的問題的解決方案可能是讓您的線程自行完成。 它可以通過線程安全方式更改的 volatile 變量(參見InterlockedIncrement() )、Windows 事件或類似的東西來完成。 如果您的線程有消息循環,您甚至可以通過發送消息要求它停止來實現。
正確的方法是使用 CreateEvent 創建一個事件“殺死我”,然后在您希望殺死線程時標記此事件。 與其讓你的線程等待while(1)
, while(WaitForSingleObject(hevent_killme, 0))
讓它等待while(WaitForSingleObject(hevent_killme, 0))
。 然后你可以簡單地讓線程回調完成並返回,不需要調用 _endthreadex 之類的。
回調函數示例:
static DWORD WINAPI thread_callback (LPVOID param)
{
...
while(WaitForSingleObject(hevent_killme, 0) != WAIT_OBJECT_0)
{
// do stuff
}
return 0;
}
呼叫者:
HANDLE hevent_killme = CreateEvent(...);
...
void killthread (void)
{
SetEvent(hevent_killme);
WaitForSingleObject(hthread_the_thread, INFINITE);
CloseHandle(hevent_killme);
CloseHandle(hthread_the_thread);
}
永遠不要使用 TerminateThread。
您可以使用while(continue_running)
代替while(1)
,當線程循環應該運行時, continue_running
為True
。 當您想停止線程時,將控制線程設置為continue_running
為False
。 當然,請確保使用互斥鎖正確保護continue_running
,因為它是一個可以從兩個線程修改其值的變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.