gpt4 book ai didi

.net-4.0 - 如何对.net中的内存映射文件使用互锁操作

转载 作者:行者123 更新时间:2023-12-04 07:42:58 25 4
gpt4 key购买 nike

有什么方法可以对存储在内存映射文件中的值使用Interlocked.CompareExchange();Interlocked.Increment();方法吗?

我想实现一个多线程服务,将其数据存储在内存映射文件中,但是由于它是多线程的,因此我需要防止冲突的写操作,因此我想知道互锁操作而不是使用显式锁。

我知道使用 native 代码是可行的,但是可以在.NET 4.0上的托管代码中完成吗?

最佳答案

好的,这就是您的做法!我们必须弄清楚这一点,我想我们可以将一些东西还给stackoverflow!

class Program
{

internal static class Win32Stuff
{
[DllImport("kernel32.dll", SetLastError = true)]
unsafe public static extern int InterlockedIncrement(int* lpAddend);
}

private static MemoryMappedFile _mmf;
private static MemoryMappedViewStream _mmvs;

unsafe static void Main(string[] args)
{
const int INT_OFFSET = 8;

_mmf = MemoryMappedFile.CreateOrOpen("SomeName", 1024);

// start at offset 8 (just for example)
_mmvs = _mmf.CreateViewStream(INT_OFFSET, 4);

// Gets the pointer to the MMF - we dont have to worry about it moving because its in shared memory
var ptr = _mmvs.SafeMemoryMappedViewHandle.DangerousGetHandle();

// Its important to add the increment, because even though the view says it starts at an offset of 8, we found its actually the entire memory mapped file
var result = Win32Stuff.InterlockedIncrement((int*)(ptr + INT_OFFSET));
}
}

这确实有效,并且可以跨多个过程使用!永远享受一个很好的挑战!

关于.net-4.0 - 如何对.net中的内存映射文件使用互锁操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7732042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com