2 czy463 czy463 于 2015.07.27 14:21 提问

多线程和io完成端口.内存的理解 20C

win32多线程用io完成端口进行异步操作.但是操作的时候,没有对所操作的内存进行保护,也就是说不是线程安全的,我这么理解对么?

比如读取文件.
0.申请缓冲区(buffer)
1.打开文件(设置FILE_FLAG_OVERLAPPED )
2.创建io完成端口
3.将完成端口和文件句柄关联起来
4.创建线程a.调用GetQueuedCompletionStatus
5.调用ReadFile(..,buffer,size,...)
执行步骤5之后,操作系统来读取文件,然后通知线程a,读取了多少字节等等,读取的内容存放在主线程申请的buffer中.如果我在系统读取中对buffer进行操作,就会破坏这一段内存中保存的数据.对么?

io完成端口 如果不和设备相关联,使用PostQueuedCompletionStatus和GetQueuedCompletionStatus,我是否能理解成只是一个线程向另一个指定线程发了一个消息?

io完成端口不和设备相关联的时候,a线程想将bufferA中的数据发送给b线程,发送之后马上就会重新使用bufferA,那么只能创建一个副本,然后用io完成端口发送通知.这样理解对么 ?
多线程之间互相发送接收数据,用io完成端口,应该关联什么设备?! 内存映射?

3个回答

oyljerry
oyljerry   Ds   Rxr 2015.07.27 15:58

只要有多个线程同时读写同一块内存buffer就会出现数据读写错误,就需要加锁保护

a线程要马上重新使用bufferA,那么就最好是复制一块新的空间。为了性能可以开辟一块地址进行内存映射。如果数据不大,直接分配一块堆上数据空间也是可以的

cuiwei1026522829
cuiwei1026522829   Ds   Rxr 2015.07.27 22:24
sina_2831808769
sina_2831808769   Rxr 2015.07.27 22:03

只要有多个线程同时读写同一块内存buffer就会出现数据读写错误,就需要加锁保护

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
IO完成端口与线程池
具体情况参考《windows核心编程》第五版的第十章第十一章 (Vista以上) MSDN示例http://msdn.microsoft.com/en-us/library/windows/desktop/ms686980(v=vs.85).aspx IO完成端口 1.创建空的IO完成端口,保存其句柄。 CompletePort = CreateIoCompletionPor
重叠IO-完成端口
Email:kruglinski_at_gmail_dot_com Blog:kruglinski.blogchina.com 早在两年前我就已经能很熟练的运用完成端口这种技术了,只是一直没有机会将它用在什么项目中,这段时间见到这种技术被过分炒作,过分的神秘化,就想写一篇解释它如何工作的文章.想告诉大家它没有传说中的那么高深难懂!有什么错误的地方还请高人指正.转载请注明出处及作者,谢谢!
IO完成端口简单案例,很简单,以看就会
一个很简单的完成端口案例,大家可以一起探讨。这里配合客户端测试。在TCP的协议下,完成端口的模型基本上是以下这种模式: 主线程 | CreateIoCompletionPort | CreateThread ————————— 完成端口线程 | | |---- While(TRUE) While(TRUE)----------| | | | | | Accept |------GetQueuedCompletionStatus() | | | | | | | CreateIoCompletionPort | WsaRev/WsaSend-------| | | | | |----WsaRev/WsaSend |------------ Windows系统 | | Windows系统 --------- 主线程主要负责接受客户端的连接,在侦听到客户端的连接以后,将异步接受数据,由操作系统通知 GetQueuedCompletionStatus函数获取操作。在这里Accpet和GetQueuedCompletionStatus函数都是处于阻塞模式。这种TCP模式的完成端口比较容易理解,但是在UDP协议下的实现就比较难于考虑,他没有Accept的阻塞,主线程比较难于处理。如果没有这个主线程,WsaRecfrom函数又不知道放在哪里才能够通知GetQueuedCompletionStatus得到相应的操作方式。因此,希望大家能够帮我考虑一下,这种UDP下的完成端口该怎么安排他的结构?
完成端口GetQueuedCompletionStatus返回值的问题
 完成端口GetQueuedCompletionStatus返回值的问题先看看GetQueuedCompletionStatus函数的完整声明:BOOL GetQueuedCompletionStatus(  HANDLE CompletionPort,         LPDWORD lpNumberOfBytes,      PULONG_PTR lpCompletionKey,    L
Windows 异步IO和 完成端口(IOCP)
见过网上好多的完成端口和网络通信的文章,呵呵,这里就简单的说说文件异步IO和完成端口,这里仅仅说说读取操作。下面是一些总结,很少有人提及,认真的看过MSDN文档之后得出的,欢迎指正。 要对文件异步IO操作,需要在文件创建的时候指定FILE_FLAG_OVERLAPPED属性的;异步ReadFileEx是不能读取和IO完成端口绑定的文件句柄的;异步ReadFileEx对OVERLAPPED的h
一个简单的IOCP(IO完成端口)服务器/客户端类
作者:Amin Gholiha   翻译:高庆余 文章来源:[url]http://www.codeproject.com/KB/IP/iocp_server_client.aspx[/url]   前言:源代码使用比较高级的IOCP技术,它能够有效的为多个客户端服务,利用IOCP编程API,它也提供了一些实际问题的解决办法,并且提供了一个简单的带回复的文件传输的客户端/服务器。   1
用完成端口(iocp) 写的一个简单的服务端例子
下面是用完成端口写的一个简单的 例子, 完成端口和重叠io 一样都是异步io。 代码如下。欢迎大家建议 改进、
select epoll 完成端口
select、poll、epoll之间的区别总结[整理]   select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/
Windows服务器高并发处理IOCP(完成端口)详细说明
本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了,不知该如何提笔,所以这篇文档总是在酝酿之中……酝酿了两年之后,终于决定开始动笔了,但愿还不算晚…..         这篇文档我非常详细并且图文并茂的介绍了关于网络编程模型中完成端口的方方面面的信息,从API的用法到使用的步骤,从完成端口的实现机理到实际使用的注意事项,都有所涉及,并且为了让朋友们更直观的体会完成端口的用法
Java基础总结(二)----集合、多线程、io、虚拟机等
Java集合java集合框架的结构List接口List接口通常表示一个列表(数组、队列、链表、栈等),其中的元素可以重复,常用实现类为ArrayList和LinkedList,另外还有不常用的Vector。另外,LinkedList还是实现了Queue接口,因此也可以作为队列使用。Set接口Set接口通常表示一个集合,其中的元素不允许重复(通过hashcode和equals函数保证),常用实现类有H