簡體   English   中英

如何安全地關閉包含無限循環的線程

[英]How to safely close a THREAD which has a infinite loop in it

我正在使用_beginthreadex函數創建一個線程。 我傳入的函數地址有一個無限的 while 循環( while(1) )。 我有threadidthreadhandle

我可以使用TerminateThread(threadhandle,1); 但這是危險的。

安全的方法是使用_endthreadex殺死線程,但它只能從線程內部使用,我想從外部殺死線程。

因此,請建議是否有一種安全的方法可以使用threadidthreadhandle從外部安全地關閉、結束或終止線程。

你應該- 從字面上看 -永遠不要使用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_runningTrue 當您想停止線程時,將控制線程設置為continue_runningFalse 當然,請確保使用互斥鎖正確保護continue_running ,因為它是一個可以從兩個線程修改其值的變量。

暫無
暫無

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

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