跨平台的EVENT事件 windows linux
#ifndef _HIK_EVENT_H_ #define _HIK_EVENT_H_ #ifdef _MSC_VER #include <Windows.h> #define hik_event_handle HANDLE #else #include <pthread.h> typedef struct { bool state; bool manual_reset; pthread_mutex_t mutex; pthread_cond_t cond; }event_t; #define event_handle event_t* #endif //返回值:NULL 出错 event_handle event_create(bool manual_reset, bool init_state); //返回值:0 等到事件,-1出错 int event_wait(event_handle hevent); //返回值:0 等到事件,1 超时,-1出错 int event_timedwait(event_handle hevent, long milliseconds); //返回值:0 成功,-1出错 int event_set(event_handle hevent); //返回值:0 成功,-1出错 int event_reset(event_handle hevent); //返回值:无 void event_destroy(event_handle hevent); #endif //////////// <PRE class=cpp name="code">#include "event.h" #ifdef __linux #include <sys/time.h> #include <errno.h> #endif #include <iostream> event_handle event_create(bool manual_reset, bool init_state) { #ifdef _MSC_VER HANDLE hevent = CreateEvent(NULL, manual_reset, init_state, NULL); #else event_handle hevent = new(std::nothrow) event_t; if (hevent == NULL) { return NULL; } hevent->state = init_state; hevent->manual_reset = manual_reset; if (pthread_mutex_init(&hevent->mutex, NULL)) { delete hevent; return NULL; } if (pthread_cond_init(&hevent->cond, NULL)) { pthread_mutex_destroy(&hevent->mutex); delete hevent; return NULL; } #endif return hevent; } int event_wait(event_handle hevent) { #ifdef _MSC_VER DWORD ret = WaitForSingleObject(hevent, INFINITE); if (ret == WAIT_OBJECT_0) { return 0; } return -1; #else if (pthread_mutex_lock(&hevent->mutex)) { return -1; } while (!hevent->state) { if (pthread_cond_wait(&hevent->cond, &hevent->mutex)) { pthread_mutex_unlock(&hevent->mutex); return -1; } } if (!hevent->manual_reset) { hevent->state = false; } if (pthread_mutex_unlock(&hevent->mutex)) { return -1; } return 0; #endif } int event_timedwait(event_handle hevent, long milliseconds) { #ifdef _MSC_VER DWORD ret = WaitForSingleObject(hevent, milliseconds); if (ret == WAIT_OBJECT_0) { return 0; } if (ret == WAIT_TIMEOUT) { return 1; } return -1; #else int rc = 0; struct timespec abstime; struct timeval tv; gettimeofday(&tv, NULL); abstime.tv_sec = tv.tv_sec + milliseconds / 1000; abstime.tv_nsec = tv.tv_usec*1000 + (milliseconds % 1000)*1000000; if (abstime.tv_nsec >= 1000000000) { abstime.tv_nsec -= 1000000000; abstime.tv_sec++; } if (pthread_mutex_lock(&hevent->mutex) != 0) { return -1; } while (!hevent->state) { if (rc = pthread_cond_timedwait(&hevent->cond, &hevent->mutex, &abstime)) { if (rc == ETIMEDOUT) break; pthread_mutex_unlock(&hevent->mutex); return -1; } } if (rc == 0 && !hevent->manual_reset) { hevent->state = false; } if (pthread_mutex_unlock(&hevent->mutex) != 0) { return -1; } if (rc == ETIMEDOUT) { //timeout return 1 return 1; } //wait event success return 0 return 0; #endif } int event_set(event_handle hevent) { #ifdef _MSC_VER return !SetEvent(hevent); #else if (pthread_mutex_lock(&hevent->mutex) != 0) { return -1; } hevent->state = true; if (hevent->manual_reset) { if(pthread_cond_broadcast(&hevent->cond)) { return -1; } } else { if(pthread_cond_signal(&hevent->cond)) { return -1; } } if (pthread_mutex_unlock(&hevent->mutex) != 0) { return -1; } return 0; #endif } int event_reset(event_handle hevent) { #ifdef _MSC_VER //ResetEvent 返回非零表示成功 if (ResetEvent(hevent)) { return 0; } return -1; #else if (pthread_mutex_lock(&hevent->mutex) != 0) { return -1; } hevent->state = false; if (pthread_mutex_unlock(&hevent->mutex) != 0) { return -1; } return 0; #endif } void event_destroy(event_handle hevent) { #ifdef _MSC_VER CloseHandle(hevent); #else pthread_cond_destroy(&hevent->cond); pthread_mutex_destroy(&hevent->mutex); delete hevent; #endif }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
2011-08-06 Linux下的多线程编程