真正明白 重叠io完成例程 的原理请进...

yaozhiyong110 2011-06-13 07:57:45
重叠io完成例程一般形式如下:

...
while(true)
{
接收连接
...
if(WSARecv(sClient ,pBuf,1,&dwRecvBytes,&Flags,pOverlapped, CompletionRoutineRecv) == SOCKET_ERROR)
{
// 返回WSA_IO_PENDING是正常情况
if(WSAGetLastError() != WSA_IO_PENDING)
{
// 关闭
}
}
}


CompletionRoutineRecv接收操作完成的执行函数

我的问题是:

执行CompletionRoutineRecv的线程和while(true)的执行线程是同一个线程

那么这是怎么实现的? 按理来说 while(true) 不是一直在死循环吗?

是趁accept的间隙来执行CompletionRoutineRecv? 这个怎么实现的呢?

懂点的说说思路 不懂的有想法也可以说说 大家一起讨论下 完全不懂的

就不要说些不切实际的 谢谢...
...全文
252 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
yaozhiyong110 2011-06-15
  • 打赏
  • 举报
回复
非常感觉大家 剩下的我可以自己去研究了...
yaozhiyong110 2011-06-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 visualeleven 的回复:]
你应该问什么叫做异步过程调用??

异步调用就是你的线程处于阻塞状态下,操作系统 以你进程的名义和当前线程的现场 去执行一项任务。(而且这些任务限定在有限的几类)QueueUserAPC函数就是向操作系统注册当自己处于alertable state(可警觉状态,相当于阻塞状态)应该做执行什么 APC 函数。 当你调用这个函数的时候不会立即马上调用 你所指定的 APC 函数 ,而是要当你的线程进……
[/Quote]

第一个回复就这样回答多好??? 降低了您在我心中膜拜的程度...
yaozhiyong110 2011-06-15
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 xiaoxiaoyu85 的回复:]
楼长要的是重叠I/O模型还是 完成端口模型? 重叠的我有一个,刚好最近在看这个。
[/Quote]

看清我的问题了???
武汉元码科技 2011-06-14
  • 打赏
  • 举报
回复
楼长要的是重叠I/O模型还是 完成端口模型? 重叠的我有一个,刚好最近在看这个。
yao050421103 2011-06-14
  • 打赏
  • 举报
回复
8楼正解
yynetsdk 2011-06-14
  • 打赏
  • 举报
回复
http://yynetsdk.blog.163.com/blog/static/187561155201159193419/

趣谈了iocp各个细节。
chenjiawei007 2011-06-14
  • 打赏
  • 举报
回复
iocp是在传输层做的封装,也就是说socket创建,bind() listen()之后开始,iocp底层是自己封装了线程池来处理,记录下了socket句柄和sockaddr信息,将请求与操作分离来操作,达到异步效果。

iocp有个好处是windows自己实现了线程的调度,效率比自己封装要好许多,不同版本的系统调度算法都有可能改变,而用户可改变的空间非常有限,所以windows下开发iocp是首选。
wocow3 2011-06-13
  • 打赏
  • 举报
回复
winsock的重叠io是种user APC,不同于kernel APC,user APC的处理要求线程处于可警觉的等待状态
简单的说,线程有一个APC队列,user APC添加到这个队列
当线程WaitXXEx(可警觉等待)时,发现有挂起的user APC请求或者等待一段时间后有新的user apc请求,线程解除等待状态返回WAIT_IO_COMPLETION。
关于user apc routine的调用时机是线程从kernel mode重回user mode的过程中,也就是说正好发生在waitxxex返回WAIT_IO_COMPLETION之前。

kyotrue 2011-06-13
  • 打赏
  • 举报
回复
操作系统实现的,这个机制应该叫Alertable I/O,是MS为了提高并发I/O处理效率加入的,不过后来发现这种方式虽然单线程性能很好,但是不能很好的利用多核多线程CPU资源,所以才又加入了IOCP。

你的问题其实在《windows核心编程》第10章最后一节有详细介绍,包括重叠I/O的四种通知模式:
1、直接等待I/O对象
2、Event
3、Alertable I/O
4、IOCP

maoxing63570 2011-06-13
  • 打赏
  • 举报
回复
看看win32多线程编程的第6章中有相关的介绍
maoxing63570 2011-06-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 visualeleven 的回复:]
你应该问什么叫做异步过程调用??

异步调用就是你的线程处于阻塞状态下,操作系统 以你进程的名义和当前线程的现场 去执行一项任务。(而且这些任务限定在有限的几类)QueueUserAPC函数就是向操作系统注册当自己处于alertable state(可警觉状态,相当于阻塞状态)应该做执行什么 APC 函数。 当你调用这个函数的时候不会立即马上调用 你所指定的 APC 函数 ,而是要当你的线程进……
[/Quote]
++++++++++++
Eleven 2011-06-13
  • 打赏
  • 举报
回复
你应该问什么叫做异步过程调用??

异步调用就是你的线程处于阻塞状态下,操作系统 以你进程的名义和当前线程的现场 去执行一项任务。(而且这些任务限定在有限的几类)QueueUserAPC函数就是向操作系统注册当自己处于alertable state(可警觉状态,相当于阻塞状态)应该做执行什么 APC 函数。 当你调用这个函数的时候不会立即马上调用 你所指定的 APC 函数 ,而是要当你的线程进入alertable state状态的时候。下面的这下函数可以使你进入alertable state状态:SleepEx,SignalObjectAndWait,MsgWaitForMultipleObjectsEx, WaitForMultipleObjectsEx,or WaitForSingleObjectEx、
yaozhiyong110 2011-06-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 kyotrue 的回复:]
asynchronous procedure call (APC)

当你调用了SleepEx、WaitForSingleObjectEx等函数进入阻塞状态后,系统就会从APC队列中取出需要回调的函数让此线程执行。
[/Quote]

怎么实现的? 我也猜是 线程阻塞的间隙 执行的CompletionRoutineRecv 这个层面算是操作系统

的底层实现 还是本身就存在这样的机制? 如果本本身存在这样的机制 那么我就想知道 这个机制是怎么

实现的 这位兄弟有相关了解吗? 谢谢...
yaozhiyong110 2011-06-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jsyren 的回复:]
五种模型,没全记得很清楚,想着用到了再去查书,哈哈!我的观点对么?
[/Quote]

书上没我要的答案
yaozhiyong110 2011-06-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 visualeleven 的回复:]
http://blog.csdn.net/VisualEleven/archive/2010/11/16/6011417.aspx
重叠IO模型的例子
[/Quote]

看清我的问题 这样太不负责任了 我要的不是怎么做...
jsyren 2011-06-13
  • 打赏
  • 举报
回复
五种模型,没全记得很清楚,想着用到了再去查书,哈哈!我的观点对么?
sunshine_msdn 2011-06-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 kyotrue 的回复:]

asynchronous procedure call (APC)

当你调用了SleepEx、WaitForSingleObjectEx等函数进入阻塞状态后,系统就会从APC队列中取出需要回调的函数让此线程执行。
[/Quote]

正解,当线程处于可唤醒态时被执行,你问的问题与IOCP无关
Eleven 2011-06-13
  • 打赏
  • 举报
回复
kyotrue 2011-06-13
  • 打赏
  • 举报
回复
asynchronous procedure call (APC)

当你调用了SleepEx、WaitForSingleObjectEx等函数进入阻塞状态后,系统就会从APC队列中取出需要回调的函数让此线程执行。

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧