
文章图片

我们可以通过调用CreateTimerQueueTimer这个API来创建一个一次性定时器 , 只需传递一个WT_EXECUTEONLYONCE标志就行 。 如果你仔细阅读开发文档 , 则会发现文档有这么一句话:当你不再需要使用定时器时 , 你需要调用DeleteTimerQueueTimer来释放定时器 。
问题来了:既然是一个一次性的定时器 , 为啥还需要手动释放它呢?
【携程|是否需要手动释放一次性定时器?】为了回答这个问题 , 我想向你介绍一套关于解答此类问题的一种标准技法:让我们假设 , 这个定时器使用之后 , 我们不释放它 , 看看会发生什么?
一方面 , 这会导致API的行为看起来很怪异 。 调用者调用CreateTimerQueueTimer函数后 , 需要跟踪定时器的属性(例如它是一次性的还是其他类型的) , 还需要知道定时器的句柄是否需要被删除 。
更糟糕的是 , 如果一次性定时器是可以实现自动释放的 , 则调用者几乎不太可能正确地使用它 。
假设 , 你有一个对象 , 它创建了一个一次性定时器 , 你希望在对象的析构函数中释放它 。 如果这个定时器是自动释放的 , 则就不可能像下图这样编写代码:
你可能会说 , ”我可以设计一个回调函数来将这个m_hTimer变量设置为空 。 这样 , 析构函数就知道定时器被激活过了 。 ”
但是 , 这会导致一个潜在的竞争条件(Race Condition) , 如下图所示:
如果在竞争条件期间回调被抢占并且对象被析构 , 并且一次性定时器正在自动释放 , 那么对象将会使用无效的句柄 。
这个竞争条件窗口是无法关闭的 , 因为竞争条件甚至在你有机会执行一行代码之前就已经发生了 。
所以 , 请开心笑纳:你必须手动释放一次性计时器的句柄 。
总结对于实现了自动释放的对象来说 , 要么它完美地实现了自动化释放 , 这样调用者就不用太关心调用细节(干就完事了) 。
要么 , 还是老老实实将控制权交给调用者吧 。
最后Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一 , 里面有很多关于Windows的小知识 , 对于广大Windows平台开发者来说 , 确实十分有帮助 。
本文来自:《Do you need clean up one-shot timers?》
- 为验证人类和黑猩猩,是否会产生新的后代,科学家找来5位姑娘!
- 太空中的真菌毒素是否危害宇航员健康?科学家:尚不明确
- MacBook|购买二手MacBook需要注意这些点,了解透彻大胆买
- 甩掉字幕看韩剧!只需要这个操作就够啦!
- 京东e卡批量绑定软件
- 腾讯游戏|守护袁昆:公众号是否和网站一样没办法做了?
- oppopad|1299元起的轻薄实力派!OPPO Pad Air是否值得选?
- 华为|越来越全面性的手机,过度使用,是否会损坏其内存卡机速度
- 现在门锁的样式越来越多,普通家庭是否有必要安装指纹锁门?
- 运营商|安规电容一般应用在什么地方?在减压时需要注意哪几点?
