C++ 线程同步event事件
线程的执行是随机时间片的,如果要控制线程间同步执行,需要做同步。
event事件:是一个内核对象,事件对象包含引用计数、事件类型、事件的通知状态等信息。主要分为2种,人工重置对象和自动重置对象。人工重置,则需要开发人员自行调用ResetEvent设置成无信号状态;自动重置,则当等待对象有信号后系统自动重置该事件对象成无信号状态。
下面编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。 思路:A->B->C->A...
HANDLE hEventA,hEventB,hEventC; HANDLE szThread[3]; DWORD WINAPI ThreadProcA(LPVOID lpParam) { // printf("inThreadA ...\n"); for(int i=0; i<10;i++) { WaitForSingleObject(hEventA,INFINITE); printf("A"); SetEvent(hEventB); } // printf("inThreadA exitA\n"); return 1; } DWORD WINAPI ThreadProcB(LPVOID lpParam) { // printf("inThreadB ...\n"); for(int i=0; i<10;i++) { WaitForSingleObject(hEventB,INFINITE); printf("B"); ResetEvent(hEventB);//手动事件 SetEvent(hEventC); } // printf("inThreadA exitB\n"); return 1; } DWORD WINAPI ThreadProcC(LPVOID lpParam) { // printf("inThreadC ...\n"); for(int i=0; i<10;i++) { WaitForSingleObject(hEventC,INFINITE); printf("C"); SetEvent(hEventA); } printf("\n"); // printf("inThreadC exitC\n"); return 1; } void testABC() { printf("create events ...\n"); hEventA = CreateEventA(0,FALSE,TRUE,0); // 初始有信号后自动无信号,等待c置为有信号,置b有信号 hEventB = CreateEventA(0,TRUE,FALSE,0); // 初始无信号,等待A置为有信号后,手动置为无信号,置c为有信号 hEventC = CreateEventA(0,FALSE,FALSE,0);// 初始无信号,等待B置为有信号后,自动至为无信号, 至a为有信号 ResetEvent(hEventA); printf("create threads ...\n"); szThread[2] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProcA, NULL, 0,NULL); szThread[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProcB, NULL, 0,NULL); szThread[0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProcC, NULL, 0,NULL); printf("wait threads ...\n"); SetEvent(hEventA); WaitForMultipleObjects(3,szThread,TRUE,INFINITE); printf("wait threads finished!\n"); CloseHandle(szThread[0]); CloseHandle(szThread[1]); CloseHandle(szThread[2]); CloseHandle(hEventA); CloseHandle(hEventB); CloseHandle(hEventC); } ////////////////////////////////////////////////////////////////////////// int main(int argc, char* argv[]) { printf("Hello World!\n"); testABC(); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现