有关完成端口连续多次投递的问题。

smzgl 2009-06-12 10:12:05
如果连续多次投递事件,假设是写事件。那么完成端口有会返回多个完成通知。这些通知会不会分散在多个线程当中呢?
...全文
95 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
songtao_01 2009-06-15
  • 打赏
  • 举报
回复
如果连续多次投递事件,假设是写事件。那么完成端口有会返回多个完成通知。这些通知会不会分散在多个线程当中呢?
会,所以要做好同步
songtao_01 2009-06-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 crst_zh 的回复:]
对于多次投递,如果每个完成通知之后再发送一个请求,那么相当于单线程在处理,并不能很好的提高性能。
可以这样:

一次投递多个请求,让cpu同时工作,问题在于WSARecv()的参数
  int WSAAPI WSARecv ( SOCKET s,
LPWSABUF lpBuffers,//这个参数可以利用
  DWORD dwBufferCount,
LPDWORD lpNumberOfBytesRecvd,
  LPINT lpFlags,
LPWSAOVERLAPPED lpOverlapped,
  LPWSAOVERLAPPED_COMPLETI…
[/Quote]
还觉得还有个问题,你接收的时候如果没接到一个完整的PER_IO_OPERATION_DATA数据,怎么解决.打个比方比如ABC是一个数据,DEF是另一个数据.接到的数据可能是CDABEF,怎么重新组合起来呢.或者会不会产生前面所说情况.
crst_zh 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mfc168 的回复:]
一次写,就是一次通知
工作线程query的时候,Event为Write

你接收缓冲大小可以自己调整,但是必须为循环接收,才能接收完全
[/Quote]
多谢!这下我也清楚了。
mfc168 2009-06-12
  • 打赏
  • 举报
回复
一次写,就是一次通知
工作线程query的时候,Event为Write

你接收缓冲大小可以自己调整,但是必须为循环接收,才能接收完全
crst_zh 2009-06-12
  • 打赏
  • 举报
回复
如果连续投递,那么会在队列中有好几个未决请求,每一个未决请求最终会有一个对应的完成通知。这些通知会分散在多个线程中。

考虑这样的一个情况:一次投递的包>发送缓冲区,例如发送1000字节,但是缓冲区大小只是400,那么一次投递时间会产生3个完成通知。
我的理解,欢迎高手指正。
rularys 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 crst_zh 的回复:]
如果连续投递,那么会在队列中有好几个未决请求,每一个未决请求最终会有一个对应的完成通知。这些通知会分散在多个线程中。

考虑这样的一个情况:一次投递的包>发送缓冲区,例如发送1000字节,但是缓冲区大小只是400,那么一次投递时间会产生3个完成通知。
我的理解,欢迎高手指正。
[/Quote]

一次成功的投递只会有一次完成通知。
crst_zh 2009-06-12
  • 打赏
  • 举报
回复
对于多次投递,如果每个完成通知之后再发送一个请求,那么相当于单线程在处理,并不能很好的提高性能。
可以这样:

一次投递多个请求,让cpu同时工作,问题在于WSARecv()的参数
  int WSAAPI WSARecv ( SOCKET s,
LPWSABUF lpBuffers,//这个参数可以利用
  DWORD dwBufferCount,
LPDWORD lpNumberOfBytesRecvd,
  LPINT lpFlags,
LPWSAOVERLAPPED lpOverlapped,
  LPWSAOVERLAPPED_COMPLETION_ROUTINE  lpCompletionRoutine );

typedef struct
{
OVERLAPPED Overlapped;
WSABUF DataBuf;
CHAR Buffer[DATA_BUFSIZE]; //接收缓冲
DWORD BytesSEND; //发送字节数
DWORD BytesRECV; //接收字节数
DWORD Sesuence; //序号} PER_IO_OPERATION_DATA, * LPPER_IO_OPERATION_DATA;

我们是不是可以建立一个数组比如PER_IO_OPERATION_DATA PIOD[1000]
每一个重叠请求编上序号,那么每次请求的时候,第2个参数直接根据序号指向数组的相应位置,那么多个线程(多CPU计算机)同时工作,各自填写自己对应的那部分,比如:请求序号为100,则自动填写PIOD[100]的部分,请求序号为102,则自动填写PIOD[102]的部分,这样对于完成通知,可能102号结束的更早,但是没有影响,数组里面的结果自然有序。

马上测试,欢迎大家指正。


18,356

社区成员

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

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