windows平台Event信号量实现延时效果+Linux平台延时(加锁解锁相关)

70 篇文章 1 订阅

今天解决了一个小问题,记录一下

1、windows平台

工作上遇到一个问题:在一个线程里边每隔5S打印数据,想按任意键退出,但是每次退出都要等一会,因为sleep了5S,为了及时退出,采用event等待事件超时的办法就可以了。
第一步:定义一个全局handle

HANDLE hEvent = NULL;

第二步:主函数里边创建一个事件,该函数具体用法 参考百度:
https://baike.baidu.com/item/CreateEvent/917012?fr=aladdin或者https://www.cnblogs.com/tinaluo/p/7686386.html

hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);//初始化时无信号状态

第三步:在统计线程函数里替换掉sleep(5);
WaitForSingleObject函数用法参考:https://www.jb51.cc/windows/686419.html或者https://www.cnblogs.com/tinaluo/p/7686386.html

DWORD dReturn = WaitForSingleObject(hEvent, 5000); //有信号时才能得到,超时设置为5000毫秒,即5s,这样会一直等着触发信号,若5s之内没有触发,就退出执行下边的程序了

第四步:在按下任意键处增加触发信号

SetEvent(hEvent);

这样就实现了按下任意键及时退出的效果了,不用再等着。

2、Linux平台

1、定义全局变量

pthread_cond_t cond;
pthread_mutex_t mutex;

2、主函数中初始化

pthread_cond_init(&cond, NULL);
pthread_mutex_init(&mutex, NULL);

3、数据统计线程中延时,规范来说应该加锁,但是不加锁也可用

struct timespec outtime; //超时变量
struct timeval now;

//pthread_mutex_lock(&mutex);//加锁
gettimeofday(&now, NULL);
outtime.tv_sec = now.tv_sec + 5;  //5s
outtime.tv_nsec = now.tv_usec * 1000;
pthread_cond_timedwait(&cond, &mutex, &outtime);//如果不写mutex,会出现段错误
//pthread_mutex_unlock(&mutex);//解锁

linux中的计时是先定一个时间点,然后等系统时间到达,以此延时

4、发信号激活等待线程

//pthread_mutex_lock(&mutex);
pthread_cond_signal(&cond);//发信号
//pthread_mutex_unlock(&mutex);

Linux平台win还是不太一样的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值