unsafe class MyClass
{
private IntPtr ptr;
public byte[] Method1(ManualResetEventSlim evt, ManualResetEventSlim init)
{
Span<byte> span = stackalloc byte[4]; // аллокация 4 байт в стеке
fixed (void* p = span) // получаю указатель
{
ptr = new IntPtr(p); // сохраняю его в поле
init.Set(); // сообщаю вызвающему коду, что я готов принять данные
evt.Wait(); // жду, когда вызывающий код закончит запись
}
return span.ToArray(); // копирую данные в обычный массив и возвращаю
}
public void Method2()
{
Span<byte> span = new Span<byte>(ptr.ToPointer(), 4); // делаю спан из указателя
for (byte i = 0; i < span.Length; i++)
{
span[i] = i; // записываю в него данные
}
}
}
这是可能的,但必须小心。
对内存中某个区域的引用是
IntPtr/UIntPtr,一个数字。你可以用数字做什么,你知道的。诚然,要获得这个数字,您必须使用不安全的代码,因为 .NET 开发人员非常注意不要弄乱堆栈上的数据。这个技巧是由专业人士完成的,不要在家里尝试。
调用代码
控制台输出
事实上,这段代码展示了如何从一个线程向堆栈写入另一个线程。一个完全没有意义的操作,有更简单和更普通的方法来传输数据,但是你问是否可以引用堆栈,我展示了如何。
但这不太可能有任何实际价值,除了一些非常特殊的多线程任务,它需要非常高的性能,并且您确实希望避免频繁的内存分配以在线程之间传输数据,即使在这种情况下还有其他,更方便的解决方案。
让我们这么说吧:堆栈是一个非常快速的存储少量数据的方法,用于一个特定线程中的方法。在多线程中使用它作为共享内存是危险的,你可以很容易地搞乱线程安全,要非常小心。