如何解决用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 举报,一经查实,本站将立刻删除。