MFC学习 事件临界区
事件:
#include <Windows.h> #include <iostream> DWORD WINAPI Func1Pro(LPVOID lpParameter); DWORD WINAPI Func2Pro(LPVOID lpParameter); int tickets = 100; HANDLE g_hEvent; void main() { HANDLE hThread1; HANDLE hThread2; hThread1 = CreateThread(NULL, 0, Func1Pro, NULL, 0, NULL); hThread2 = CreateThread(NULL, 0, Func2Pro, NULL, 0, NULL); CloseHandle(hThread1); CloseHandle(hThread2); // g_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); //人工重置的事件对象, 初始信号状态设置为无信号状态 //g_hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); //自动重置事件对象, 初始信号状态设置为无信号状态 g_hEvent = CreateEvent(NULL, FALSE, FALSE, "tickets"); if(g_hEvent) { //带名字的事件对象也是系统唯一的, 可以判断实例 if(ERROR_ALREADY_EXISTS == GetLastError()) { std::cout<< "only instance can run!" << std::endl; return; } } SetEvent(g_hEvent);//人工重置的事件对象, 会将所有线程的事件信号状态都改变 ResetEvent改成无信号 Sleep(4000); CloseHandle(g_hEvent); } DWORD WINAPI Func1Pro(LPVOID lpParameter) { while(TRUE) { WaitForSingleObject(g_hEvent, INFINITE); //如果是自动重置事件对象 处理时, 会改成非信号状态 if(tickets > 0) { Sleep(1); std::cout << "thread1 sell ticket: " << tickets-- << std::endl; } else break; SetEvent(g_hEvent); //再设置为有信号状态 } return 0; } DWORD WINAPI Func2Pro(LPVOID lpParameter) { while(TRUE) { WaitForSingleObject(g_hEvent, INFINITE);//如果是自动重置事件对象 处理时, 会改成非信号状态 if(tickets > 0) { Sleep(1); std::cout << "thread2 sell ticket: " << tickets-- << std::endl; } else break; SetEvent(g_hEvent); //再设置为有信号状态 } return 0; }
临界区:
#include <Windows.h> #include <iostream> DWORD WINAPI Func1Pro(LPVOID lpParameter); DWORD WINAPI Func2Pro(LPVOID lpParameter); int tickets = 100; CRITICAL_SECTION g_cs; void main() { HANDLE hThread1; HANDLE hThread2; hThread1 = CreateThread(NULL, 0, Func1Pro, NULL, 0, NULL); hThread2 = CreateThread(NULL, 0, Func2Pro, NULL, 0, NULL); CloseHandle(hThread1); CloseHandle(hThread2); InitializeCriticalSection(&g_cs); //初始化临界区对象 Sleep(4000); DeleteCriticalSection(&g_cs); } DWORD WINAPI Func1Pro(LPVOID lpParameter) { while(TRUE) { EnterCriticalSection(&g_cs); //检查是否能进入临界区 if(tickets > 0) { Sleep(1); std::cout << "thread1 sell ticket: " << tickets-- << std::endl; } else break; LeaveCriticalSection(&g_cs); } return 0; } DWORD WINAPI Func2Pro(LPVOID lpParameter) { while(TRUE) { EnterCriticalSection(&g_cs); if(tickets > 0) { Sleep(1); std::cout << "thread2 sell ticket: " << tickets-- << std::endl; } else break; LeaveCriticalSection(&g_cs); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义