MemoryMappedFile doesn't work with 2 processes?

前端 未结 2 1926
生来不讨喜
生来不讨喜 2020-12-18 13:58

I\'ve made a simple test with a MemoryMappedFile as msdn says :

2 processes, 1 memory mapped file :

  • the first process adds the string \"1
相关标签:
2条回答
  • 2020-12-18 14:34

    You are battling an implementation detail of BinaryWriter.Write(string). It writes the length of the string first, required so that BinaryReader knows how many characters it needs to read when reading the string back. For short strings, like "1", it writes a single byte to store the length.

    So the offset you pass to CreateViewStream() is wrong, passing 1 will make it overwrite part of the string written by process A. The smiley character you see is the glyph for (char)1. The length byte of the string written by process B.

    Memory mapped files are troublesome in managed code. You normally read and write to them by declaring a struct to set the layout and using pointers to access the view but that requires unsafe code. Streams are a pretty poor abstraction for a chunk of memory but a necessary evil. Also the reason it took so long for MMFs to become available in .NET.

    0 讨论(0)
  • 2020-12-18 14:45

    EDIT

    I noticed one apparently strange thing in the code of ProcessB. This code

    using (MemoryMappedViewStream stream = mmf.CreateViewStream(1, 0))
    

    creates a view from the first byte, but the strings in .NET are 2 bytes. I think it should be enough to you to make that 1->2 become 2. So the offset of the ProcessB view from the start of the mapped file will be after already inserted "1" string from ProcessA.

    In your case seems that you overlap them.

    Hope this helps.

    0 讨论(0)
提交回复
热议问题