[英]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.