通过Event事件正确结束线程

本文介绍如何通过Event对象安全地结束Win32多线程程序中的线程。主要步骤包括声明和创建Event对象、在线程函数中检查Event状态以确定是否退出线程、在主线程中设置Event对象为激发状态以触发线程结束。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

步骤:
1.首先声明一个全局的Event对象
HANDLE hRequestExitEvent = FALSE;
2.在主线程中创建这个Event对象
hRequestExitEvent = CreateEvent(NULL, TRUE, false, NULL);
注意:此处的第三个参数应该使用false,因为如果使用true在事件创建开始就是处于
激发状态,这样就立刻结束线程了,所以此处应该使用false作参数
3.在线程函数中使用如下语句来不断探测Event对象的状态并确定是否退出线程
WaitForSingleObject(hRequestExitEvent, 0)
注意:此处的此处的第二个参数为0,这里使用了WaitForSingleObject()函数一个很重
要的用途,设定这个参数为0,是你能够检查handle的状态并立刻返回,没有片刻停留,
如果handle已经备妥,这个函数会成功并传回WAIT_OBJET_0,否则这个函数立刻传
回WAIT_TIMEOUT。
4.在主线程中需要结束该线程的地方调用如下语句设置Event对象为激发状态
SetEvent(hRequestExitEvent);
这样便可安全的结束一个线程
参考代码:
说明:该实例代码参考《Win32 多线程程序设计(候捷译)》中的THRDTERM程序,该程序创建两个线程,周期性地检查一个Event对象,以决定要不要结束自己。
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
#include "MtVerify.h"
DWORD WINAPI ThreadFunc(LPVOID);
HANDLE hRequestExitEvent = FALSE;//设置全局EVENT对象
int main()
{
HANDLE hThreads[2];
DWORD dwThreadId;
DWORD dwExitCode = 0;
int i;
hRequestExitEvent = CreateEvent(
NULL, TRUE, false, NULL); // 创建Event对象
for (i=0; i<2; i++)
MTVERIFY( hThreads[i] = CreateThread(NULL,
0,
ThreadFunc,
(LPVOID)i,
0,
&dwThreadId )
);
// Wait around for awhile, make
// sure the thread is running.
Sleep(1000);
SetEvent(hRequestExitEvent);//设置Event对象为激发状态,结束线程
WaitForMultipleObjects(2, hThreads, TRUE, INFINITE);// 等待两个线程都成为激发状
态,可以保证线程都已安全地离开。
printf("1234/n");
for (i=0; i<2; i++)
MTVERIFY( CloseHandle(hThreads[i]) );
return EXIT_SUCCESS;
}
DWORD WINAPI ThreadFunc(LPVOID p)
{
int i;
int inside = 0;
UNREFERENCED_PARAMETER(p);
/* Seed the random-number generator */
srand( (unsigned)time( NULL ) );
for (i=0; i<1000000; i++)
{
double x = (double)(rand())/RAND_MAX;
double y = (double)(rand())/RAND_MAX;
if ( (x*x + y*y) <= 1.0 )
inside++;
if (WaitForSingleObject(hRequestExitEvent, 0) != WAIT_TIMEOUT) // 判断Event对
象是否为激发状态,从而决定是否退出
{
printf("Received request to terminate/n");
return (DWORD)-1;
}
}
printf("PI = %.4g/n", (double)inside / i * 4);
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值