
Sebastian Redl wrote:
Phil Endecott wrote:
Does anyone have any ideas about the behaviour of memory-mapped files on network filesystems, i.e. NFS and/or Windows shares? Is there any chance that Boost.Interprocess could use mmaped files on such filesystems, with instances of the program running on different machines sharing data?
MSDN has this to say for CreateFileMapping:
Although *CreateFileMapping* works with remote files, it does not keep them coherent. For example, if two computers both map a file as writable, and both change the same page, each computer only sees its own writes to the page. When the data gets updated on the disk, it is not merged.
Any ideas when the write-back occurs? When the file is closed / unmapped? Can you call flush to force write back? (Does interprocess support any of this?)
Although I couldn't find concrete information in the man pages, some Google results on "mmap consistent" suggest that mmap behaves the same.
I have had a look at the NFS spec and it says a lot about what implementations "may" do, and it's similar. A simpler case than the example that you quote above is one writer and multiple readers. The main requirement is that when the writer's changes become visible to a reader they do so atomically, or at least in-order. I.e. if I have a large interprocess::list which spans multiple blocks, and the writer inserts something, then the readers must see either no changed blocks or all changed blocks. Or, if I have some sort of lock-free structure like a journal, and the writer appends data and then updates an end-of-journal pointer to make it visible, then the page containing the pointer must not become visible to the readers until after the pages containing the data. Anyway, I think the answer is that this is either hard or impossible; but I thought I'd ask just in case someone has already investigated. Regards, Phil.