问题描述
有没有一种方法可以锁定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 (将#修改为@)