共享数据中增加两个标识
A用标识1 B用标识2
A写入时 给标识1写入 "写入中" 之类的判断信息.
写入完毕后 写入 完毕的标识值
B读取标识1判断 A是否是在写入中
写入中就等待到写入完毕
然后B读取
B读取时给标识2写入 读取中
读取完毕写入  完毕标志
A每次写入前先判断B是否在读取中.
如果是读取中 A等待 B读取完毕.
如果读取过快可能会造成数据冲突吧..不过就没想过用更简单的方法吗 一定要用共享内存? 
可以搞个通讯发送消息之类的去互相通知数据不是更简单吗?

解决方案 »

  1.   

    to  大桶扣蛙  你好我想实现的程序可能不只程序B有可能还有程序C程序D程序E......等等都与程序A同步数据。我就想用共享数据段会不会容易点。不知道你有什么好点的建议。
      

  2.   

    用sock 或者 消息来通讯 比较容易点吧.
    这些通讯的方法都不用去管其他程序 是否读取了没,  只管自己发成功就行了.A程序就像是服务器一样. 直接通知其他程序.
      

  3.   

    to  大桶扣蛙  你好程序A是数据源。程序A当服务器要怎样通知其他程序并到位。
      

  4.   

    共享数据段最大的缺点是--长度固定。你编译时设置共享变量占用多大,运行时共享只能多大,不能随意增加,也不能物理减少(只能逻辑减少,即浪费部分空间)。 另外使用共享内存的话还有一个弱点就是不能共享指针,即程序A在共享内存中写入了一个指针,程序B不保证能读取指向的内容,即使A中指针具体指向的内容还在共享内存内,程序B的内存映射中这块共享内存可能也处于不同于A的虚拟地址上 -- 虽然这种情况在vista之前windows中使用exe中共享数据段时不会出现。但新系统中使用共享数据段时还是有很大可能发生,比如某个程序不能在指定地址加载时(加载exe时由于操作系统的ASLR造成每次加载都处于不同地址,dll默认加载地址和其它dll冲突并被其它dll使用了时)。同样的限制一样存在于filemapping共享内存中,不过filemapping由于有后台文件作为支持, 所以可以通过重新映射达到动态扩大/缩小共享内存段的目的。