线程终止、请求丢失。
来源:互联网 发布:自助下单软件 编辑:程序博客网 时间:2024/05/01 16:01
今天写一个小程序,当接收到指定消息时,创建一个SOCKET去连接指定主机,一旦接通,就向主机发送、以及从主机取回一些数据。为了避免阻塞,每当需要连接主机的时候,就创建一个线程,在该线程里调用connect(),连接成功后就用send()发送一些数据,紧接着调用WSARecv()发起一个overlapped的异步取请求,然后线程退出。
结果是,负责监视完成端口的线程,根本取不到数据,只是收到一个SOCKET断开的事件。没办法,只好单步跟踪,奇怪的是,单步跟踪时居然一切正常,该发送的数据发送了,该收到的数据也收到了,百思不得其解……加上一些调试信息,发现WSARecv()会返回WSA_IO_PENDING,这个返回值表示重叠IO已提交,但暂时没有还完成……这个返回值也属于正常情况,但偏偏就是收不到数据。< /div>
想起单步跟踪时,一切都正常,而单步跟踪与正常运行的唯一差别,可以说就是单步跟踪时执行每条语句时有延时,于是在WSARecv()前面加上一条Sleep(1000),再运行程序,惊奇地发现数据收到了,而调试信息打印的WSARecv()返回值是 0……
为什么有了延时就会成功呢,左思右想,忽然从脑海深处闪出一条很久以前的记忆:当发起IO请求的线程终止后,该IO请求将被Windows丢弃!心中一阵狂喜,几乎可以肯定就是这个原因了,马上修改代码,用QueueUserWorkItem()并且传递 WT_EXECUTEINIOTHREAD参数来取代自己创建的线程,运行后果然一切正常。
- 线程终止、请求丢失。
- 线程终止
- 线程终止
- 终止线程
- 线程终止
- 终止线程
- 终止线程
- 线程终止
- 线程之线程终止
- ajax终止请求
- 终止ajax请求
- 让终止线程
- JAVA线程的终止
- Linux线程终止
- C# 终止线程
- 线程终止方式
- 终止线程的运行
- 11.5线程终止
- 《joel 说软件》
- Win32位程序设计初步之服务
- 模糊控制介绍
- .Net调用Java的WebService实例
- Linux下GNU用法详解
- 线程终止、请求丢失。
- 公元二零零六年四月十六日
- 最新发现----葵花宝典的创始人居然是段誉!!!
- delicious书签备份工具
- 我看文档的重要性--by 翔子
- Effective C# 摘要
- EasyOA的彻底重写
- Google's Calendar
- 关于发文时的署名