繁体   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