WaitForSingleObject的一个坑

14 篇文章 0 订阅
1 篇文章 0 订阅

事情是这样的: 一个一年前写的异步队列近期使用频率比较频繁。导致了N个BUG被挖出。一个不到260行的代码文件(加上注释),在捉BUG的过程中,几乎被我重构了一番。

以前自以为与用得挺熟的多线程操作也被我发现了几个潜意识中的错误。最后在微软帮助文档中才找到了正确答案。。。。


异步队列主要需要面临的问题是资源的竞争与同步,那么我们也最有可能在此犯错误。

我写这个异步队列的思路是创建一个常驻的线程,等待一个信号量,当数据从一另一个线程中入队时,Set信号,等待线程收到信号后立马去将内存中的数据出队并通知到回调处理。

当实例析构时候,清空内存中未处理的数据,并等待线程退出后析构完毕。

看起来逻辑没有任何的问题,但是实际使用过程中总有那么一定的几率使进程无法退出。

最后对位到了我熟悉的WaitForSingleObject这个API上,有那么一点可能阻塞在这里。查看文档才恍然大悟是hHandle参数的原因。

官方的文档是这样说的: 

Parameters
hHandle [in]
A handle to the object. For a list of the object types whose handles can be specified, see the following Remarks section.

If this handle is closed while the wait is still pending, the function's behavior is undefined.

The handle must have the SYNCHRONIZE access right. For more information, see Standard Access Rights.

注意红字: 如果handle在等待时被关闭,函数的行为将无法确定。

换句话说,在代码中,不能同时在多个线程中调用CloseHandle与WaitForSingleObject!

后记:知错就改,善莫大焉~!  另外,今天在整理当时的思路时,我想到:一个异步队列开一个线程的事情太低级了,我应该考虑用高级点的方式实现它!



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值