// 线程通信机制.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #define NUM_THREADS 10 #include <windows.h> #include <stdio.h> #include <process.h> typedef struct { int Id; HANDLE hTerminate; }ThreadArgs; unsigned __stdcall ThreadFunc(void *pArgs) { HANDLE hTerminate = ((ThreadArgs *)pArgs)->hTerminate;//参数转换 int id = ((ThreadArgs *)pArgs)->Id; //运行到我们被告知需要终止的时候 while(1) { //检查我们是否需要终止 if(WaitForSingleObject(hTerminate,0) == WAIT_OBJECT_0) { //终止线程--我们调用ResetEvent来讲终止的线程返回到非激发状态之后,推出while循环 printf("Terminating Thread %d \n",id); ResetEvent(hTerminate); break; } //我们现在可以处理我们的工作,模拟这个情况,假设工作需要1秒钟来做线程需要做的工作 Sleep(1000); } _endthreadex(0); return 0; } int main(int argc ,char * argv[]) { unsigned int threadID[NUM_THREADS]; HANDLE hThread[NUM_THREADS]; ThreadArgs threadArgs[NUM_THREADS]; //创建10个线程 for(int i =0 ; i < NUM_THREADS ; i++) { threadArgs[i].Id = i; threadArgs[i].hTerminate = CreateEvent(NULL, TRUE, FALSE, NULL); hThread[i] = (HANDLE)_beginthreadex(NULL, 0, &ThreadFunc, &threadArgs[i], 0, &threadID[i]); } printf("To kill a thread (gracefully), press 0-9, then <Enter>.\n"); printf("Press any other key to exit .\n"); while (1) { int c = getc(stdin); if (c == '\n') { continue; } if (c<'0'||c>'9') { break; } SetEvent(threadArgs[c - '0'].hTerminate); } return 0; }
时间: 2024-12-05 12:07:38