真正明白 重叠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? 这个怎么实现的呢?

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

就不要说些不切实际的 谢谢...
...全文
244 19 打赏 收藏 转发到动态 举报
写回复
用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]

看清我的问题了???
96掌门师兄 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,356

社区成员

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

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