[英]Threads in C in Windows
下面的答案中提到了使用C在Windows中運行和終止線程的完美方法!
當前的實現方法面臨兩個問題:
我不能強行停止線程。 由於某種原因,它仍然繼續。 例如,我有一個for循環,它運行一個函數,該線程示例是其中的一部分。 當該函數被調用4-5次時,我在屏幕上看到多個動畫提示,即使我在函數末尾調用TerminateThread函數時,先前的線程也沒有停止。
有時,該線程根本不會運行,並且屏幕上不會顯示動畫。 這是如果我的功能代碼運行得非常快或由於其他原因,我感覺線程在初始化之前就被殺死了。 有沒有辦法等到線程初始化?
我該如何解決這些問題?
終止線程的正確方法是發信號通知線程並讓其正常完成,即:
(根據下面的@IInspectable的注釋,已更新為使用互鎖的內部函數而不是volatile標志)
HANDLE eventHnd;
HANDLE threadHnd;
LONG isStopRequested = 0; // 1 = "stop requested"
static DWORD WINAPI thread_func(LPVOID lpParam)
{
do
{
// wait until signalled from a different thread
WaitForSingleObject(eventHnd, INFINITE);
// end thread if stop requested
if (InterlockedCompareExchange(&isStopRequested, 0, 0) == 1)
return 0;
// otherwise do some background work
Sleep(500);
} while (true);
}
使用CreateEvent
函數初始化eventHnd
變量,而stopRequested
變量只是可以在主程序中設置的布爾標志:
// this creates an auto-reset event, initially set to 'false'
eventHnd = CreateEvent(NULL, false, false, NULL);
InterlockedExchange(&isStopRequested, 0);
threadHnd = CreateThread(NULL, 0, Processing_Thread, NULL, 0, NULL);
因此,只要您想告訴線程執行任務,就可以簡單地設置事件:
SetEvent(eventHnd);
當您想結束線程時,可以將標志設置為true
,向事件發出信號,然后等待線程完成:
// request stop
InterlockedExchange(&isStopRequested, 1);
// signal the thread if it's waiting
SetEvent(eventHnd);
// wait until the thread terminates
WaitForSingleObject(threadHnd, 5000);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.