内存共享-多线程和io完成端口.内存的理解

问题描述

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

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

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

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

解决方案

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

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

解决方案二:
http://blog.csdn.net/zssureqh/article/details/17203809

http://www.cnblogs.com/yuyijq/archive/2011/03/22/IO_Completion_port_with_beginRead.html

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

时间: 2024-11-05 19:32:03

内存共享-多线程和io完成端口.内存的理解的相关文章

单处理器中,多进程或多线程之间是否需要使用内存屏障

问题描述 单处理器中,多进程或多线程之间是否需要使用内存屏障 在看Linux内核内存屏障时,文章中写道"只有在存在多CPU交互或CPU与设备交互的情况下才可能需要用到内存屏障.",对此表示怀疑,难道单CPU中,两个进程或两个线程间就不需要用了么? 解决方案 使用LOCK和UNLOCK之后, 一般就不再需要其他内存屏障了(但是注意"MMIO写屏障"章节中所提到的例外). 只有在存在多CPU交互或CPU与设备交互的情况下才可能需要用到内存屏障. 如果可以确保某段代码中不

linux内存共享(转)

共享内存是系统出于多个进程之间通讯的考虑,而预留的的一块内存区.在/proc/sys/kernel/目录下,记录着共享内存的一些限制,如一 个共享内存区的最大字节数shmmax,系统范围内最大共享内存区标识符数shmmni等,可以手工对其调整,但不推荐这样做. 一.应用 共享内存的使用,主要有以下几个API:ftok().shmget().shmat().shmdt()及shmctl(). 1)用ftok()函数获得一个ID号. 应用说明:在IPC中,我们经常用key_t的值来创建或者打开信号量

CPU/GPU内存共享是什么?

  今天凌晨,英伟达官方主题会上,老黄揭晓下一代GPU,代号Pascal,同时还将加入英伟达最新NVLINK内存共享技术.历年来,传统CPU.GPU无法相互共享显存.物理内存的惯例也首次被老黄打破. 那如何实现这项技术?据英伟达官方介绍,实际使用需要英伟达NVLINK内存技术.3D虚拟内存两项技术. 简单地说,现有的统一存储器允许图形显卡访问.使用GPU内存(显存).例如,软件开发者可以在程序代码中指定两者之间的资源分配或者定义一个应用使用方法. 但是,统一存储器限制CPU.GPU只能访问使用各

c# 内存共享-c程序有没有可能调用一个正在运行并刷新的c#程序的数组

问题描述 c程序有没有可能调用一个正在运行并刷新的c#程序的数组 用c#写的接收数据程序数据,用c写的画图程序,然后呢,画图程序要调用接收数据程序收到的数据,有木有可能,这个内存共享该怎样实现呢

MySQL · 引擎特性 · InnoDB 文件系统之IO系统和内存管理

综述 在前一篇我们介绍了InnoDB文件系统的物理结构,本篇我们继续介绍InnoDB文件系统的IO接口和内存管理. 为了管理磁盘文件的读写操作,InnoDB设计了一套文件IO操作接口,提供了同步IO和异步IO两种文件读写方式.针对异步IO,支持两种方式:一种是Native AIO,这需要你在编译阶段加上LibAio的Dev包,另外一种是simulated aio模式,InnoDB早期实现了一套系统来模拟异步IO,但现在Native Aio已经很成熟了,并且Simulated Aio本身存在性能问

c++-C++复制构造函数、内存共享

问题描述 C++复制构造函数.内存共享 通过复制构造函数,复制的对象与原对象共享内存么,求各位给个解释 解决方案 因为你的Pstu(const Pstu& p)这个拷贝函数里有这么一句pointer = p.pointer; 这就使得无论是p1还是p2他们的private成员变量pointer都指向了和p一样的内存地址 所以不管是哪个对象对自己的pointer所指向的对象的count执行++操作,三个对象都能看到 解决方案二: 很多时候在我们都不知道拷贝构造函数的情况下,传递对象给函数参数或者函

linux上多个一样的软件间内存共享

问题描述 linux上多个一样的软件间内存共享 软件不可更改了,但是有一些不变的lib文件,我想让他们在内存中共享.我现在的做法是ln,但是没有作用.求大神指点迷津!!!! 解决方案 各路大神,给条活路咯 解决方案二: Linux--基于共享内存 消息队列和基于Socket的进程间的通信linux 共享内存 消息队列 udp通信Linux进程间内存共享机制mmap详解 解决方案三: lib中实现共享内存,用mmap 解决方案四: 我发现用ln没有用,每个软件启动的时候还是会重复加载一遍那些一样的

进程间通讯问题,内存共享的实现

问题描述 需要在多个进程传输数据,其实一个检测进程一直获取检测的数据,供其他进程及时读取使用,数据库不是很大,但是数据更新非常的频繁,考虑到效率问题,不知道用什么方法实现?暂时决定采用内存共享的方式实现.希望各位大虾多加指点.具体怎么实现比较好?需要注意哪些地方?如果有类似的源代码参考就最好了. 解决方案 解决方案二:方案1.使用WM_COPYDATA消息方案2.使用WriteProcessMemory(),ReadProcessMemory()访问其他进程的内存方案3.使用内存镜像文件解决方案

《高级--Java内存与多线程》

问题描述 JVM的内存管理参见下图既然只有堆区和方法区是各线程共享的,那为什么按照JMM,见下图jvm系统中存在一个主内存,Java中所有变量都储存在主存中,对于所有线程都是共享的.每条线程都有自己的工作内存(WorkingMemory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作都是在工作内存中进行,线程之间无法相互直接访问,变量传递均需要通过主存完成.现在问题来了.根据JVM内存管理提到的,只有堆内存和方法区是各线程共享的,那在JMM提到的"主内存"是不是就是指上