簡體   English   中英

Windows中C語言中的線程

[英]Threads in C in Windows

下面的答案中提到了使用C在Windows中運行和終止線程的完美方法!

當前的實現方法面臨兩個問題:

  1. 我不能強行停止線程。 由於某種原因,它仍然繼續。 例如,我有一個for循環,它運行一個函數,該線程示例是其中的一部分。 當該函數被調用4-5次時,我在屏幕上看到多個動畫提示,即使我在函數末尾調用TerminateThread函數時,先前的線程也沒有停止。

  2. 有時,該線程根本不會運行,並且屏幕上不會顯示動畫。 這是如果我的功能代碼運行得非常快或由於其他原因,我感覺線程在初始化之前就被殺死了。 有沒有辦法等到線程初始化?

我該如何解決這些問題?

終止線程的正確方法是發信號通知線程並讓其正常完成,即:

(根據下面的@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.

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