Windows 7下WinAPI/C++是否存在更轻量级的线程信号机制?
Windows平台兼容Win7的轻量级线程间信号实现方案探讨
在Windows平台实现线程间轻量级信号时,Windows 8及以上版本的理想工具是WaitOnAddress。但如果需要兼容Windows 7,目前找到比Win32 API的Event更优的方案是使用SleepConditionVariableCS。
以下是处理Ctrl-C的控制台程序极简示例:
//HANDLE Signal; // 原Event实现 CONDITION_VARIABLE Signal; CRITICAL_SECTION cs; BOOL WINAPI CtrlHandler(DWORD ctl){ switch (ctl) { case CTRL_C_EVENT: /*SetEvent(Signal);*/ WakeConditionVariable(&Signal); return TRUE; default: return FALSE; // 交给系统处理 } } int main(){ //Signal = CreateEventA(NULL, TRUE /*手动重置事件*/, // FALSE/*初始无信号*/, "ctrl-c_sig023xgyI8"); InitializeConditionVariable(&Signal); InitializeCriticalSection(&cs); SetConsoleCtrlHandler(CtrlHandler, TRUE); // 向系统注册CtrlHandler // auto hThread = CreateThread(nullptr, 0, worker, nullptr, ..); //WaitForSingleObject(Signal, INFINITE); EnterCriticalSection(&cs); SleepConditionVariableCS (&Signal, &cs, INFINITE); LeaveCriticalSection(&cs); // 停止线程、清理资源,CloseHandle(hThread); CloseHandle(Signal); return 0; }
上述示例中,用户按下Ctrl-C时,系统会启动专用线程运行CtrlHandler,向主线程发送停止信号。
现询问:Win32 API或C中是否存在更轻量的实现方式(C最终仍需调用Win32 API)?
内容的提问来源于stack exchange,提问作者Wasfi JAOUAD
相关产品推荐
相关产品推荐

