用C#不安全的非托管代码锁定结构

问题描述

有没有一种方法可以锁定C#中不安全的非托管结构? 我试图用信号量实现类似于C的模式,但是C#仅管理了 不能在非托管结构中使用。

[StructLayout(LayoutKind.Sequential)]
public unsafe struct MemoryChunk
{
    public volatile int semaphore;
    public fixed byte buffer[1024];
}

// In thread group A
public static unsafe void ProcessA()
{
    MemoryChunk* chunk = GetChunk(...);
    Process(chunk);
}

// In thread group B
public static unsafe void ProcessB()
{
    MemoryChunk* chunk = GetChunkFromElseWhere(...);
    Process(chunk);
}

// The actual method.
public static unsafe void Process(MemoryChunk* chunk)
{
    if(chunk->semaphore > 0)
        // HERE I NEED TO WAIT
    chunk->semaphore += 1;
    // ...
    chunk->semaphore -= 1;
}

问题是 lock Monitor.Enter 仅需要对象。 也不能将 Dictionary MemoryChunk *作为键,将 object 作为值,因为 其他一些线程也可以访问该 MemoryChunk ,而该内存将无法访问 Dictionary

C#是否有任何其他API(例如POSIX sem_t )可以在没有Interop的情况下存储在非托管结构中?

编辑:我修改了该示例,以使我更清楚地知道,我无法将对象作为对实际方法的锁定。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)