打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【专业技术】Windows里面如何玩转线程?

我们在编写程序的时候,常常会需要一些线程的delay函数。这个问题说简单也简单,说复杂也复杂。比如很多人读知道delay直接用Windows的API函数Sleep啊,确实没错,这个可以实现一个指定毫秒数的等待,我本身也会常常使用它,那么我要问一个问题,这个问题不管是在Windows、Linux还是其他系统都会存在。这个问题就是:是否每个地方的等待函数都可以用Sleep(Linux下pthread_delay函数)?这个看似简单的问题,我估计不少人都会被问住,回答是吧,感觉可能不会这么简单;如果不是,那能举个例子出来吗?


大家考虑好了吗?你的答案是什么呢?我的答案是有时候可以使用,但是很多时候都不能用,尤其不能长时间等待时使用。为什么?其实前一句话就已经回答这个问题了。想想我们的程序要是长时间去调用Sleep这个函数,线程会无条件的停止在这里,这就是问题所在,注意这个“无条件”等待是关键。我现在就举例来说明一下,如果你的程序在在执行Sleep,而且时间相对较长,结果有用户要退出程序该怎么办?这个时候,你的线程就是上面说的“无条件”等在这里,一般来说,安全退出应用程序是需要每个线程都安全退出的,但现在你的这个线程正在等待,要是等待时间一小时,难道你的程序点击退出后,需要一小时后才正在退出?这是个极端例子,但即使是三秒钟来说也是不好的,至少程序体验太差,按退出都要3秒才完!另外还有很多情况是需要在程序中等待中断,这可是永久等待,这种情况下也需要退出程序或者类似的情况怎么处理了?


所以等待这个问题看似简单,实际并不是看起来这么简单。要解决这个问题,一般做法是采用同步对象来解决,这种办法在各个平台都是类似的,只要找相应的函数就行了,我这里就以Windows平台来说明。


在Windows平台下,典型的同步对象有信号量和事件,我们就用事件来完成这个等待:


基本的Sleep功能就用同步对象的超时功能来解决实现等待,API函数是WaitForSingleObject,而需要退出时,只要设置一个事件信号就可以了,这样就解决了这个问题。另外一种情况就是往往出现终端等待或者永久等待的情况,这个同样可以用事件来完成,但是在等待的函数一般应选取等待多对象的函数,对应的API是WaitForMultipleObjects,这个函数一个对象作为永久信号等待对象,一个是最为退出这种情况的临时退出等待对象。


在我的程序中,我更多的是使用上面的等待而不是Sleep函数,要是读者遇到这种类似的问题,不防试试上述解决办法。


联盟推出专业技术系列,如果有编程疑惑可按照如下格式:

专业技术+个人昵称+具体问题

输入到微信公众号里面,具有代表性的问题,联盟将整理成文章发表

输入js获取所有的答疑释惑文章,或者点击“阅读原文

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Delphi多线程编程-南山古桃-关键词:Delphi,线程,多线程,详解,TThread...
句柄和指针的区别
java 笔记本
VC windows api 多线程---互斥量、信号量、临界值
while(true)循环与CPU占用率问题
VB中实现延时(等待)的几种方法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服