我有几个(托管/.NET)进程通过一个环形缓冲区进行通信,该缓冲区通过 MemoryMappedFile 类保存在共享内存中(只是内存没有文件映射)。我从 SafeBuffer 参考源中知道,将结构写入该内存受到 CER(约束执行区域)的保护,但是如果写入过程在这样做时被操作系统异常终止怎么办?这会导致结构仅被部分写入吗?
struct MyStruct
{
public int A;
public int B;
public float C;
}
static void Main(string[] args)
{
var mappedFile = MemoryMappedFile.CreateOrOpen("MyName", 10224);
var accessor = mappedFile.CreateViewAccessor(0, 1024);
MyStruct myStruct;
myStruct.A = 10;
myStruct.B = 20;
myStruct.C = 42f;
// Assuming the process gets terminated during the following write operation.
// Is that even possible? If it is possible what are the guarantees
// in regards to data consistency? Transactional? Partially written?
accessor.Write(0, ref myStruct);
DoOtherStuff(); ...
}
由于写入内存非常快,因此很难模拟/测试这个问题是否真的存在。但是,这肯定会导致我的共享内存布局严重不一致,并且有必要通过例如校验和或某种页面翻转来解决这个问题。
更新:
查看第 1053 行
它基本上归结为在执行 CER 块中的代码(设置了 Consistency.WillNotCorruptState 标志)时是否保护进程免受异常终止的问题。