pinvoke:线程与共享内存缓冲区

时间:2021-04-27 07:11:17

标签: c# .net-core pinvoke

在阅读了多篇关于 SO 的帖子后,我需要在 C# 端预先分配我的内存缓冲区,将其传递给本机端,以便当函数返回时内存缓冲区中的值将被正确填充(这样可以避免多个副本数据)。

见:

基本上是:

[DllImport("NativePlugin", CallingConvention = CallingConvention.Cdecl)]
private static extern void fillArrayNative(IntPtr data, int count, out int outValue);

public unsafe void getFillArrayNative(float[] outArray, int count, out int outValue)
{
    //Pin Memory
    fixed (float* p = outArray)
    {
        fillArrayNative((IntPtr)p, count, out outValue);
    }
}

我怎样才能确保这个函数是线程安全的?这里的要点是,当我遍历每个文件并填充 outArray 时,应该使用相同的缓冲区 outArray

1 个答案:

答案 0 :(得分:0)

<块引用>

我怎样才能确保这个函数是线程安全的?

与确保所有其他函数都是线程安全的方式相同。

fillArrayNative 运行时,它可能对数组具有独占访问权限。如果方法在内部使用线程,则由方法本身来执行任何必要的同步。

一旦 fillArrayNative 返回,它可能不再访问数组。如果它确实保存指针供以后使用,那么您将面临的不仅仅是线程问题。 fixed 语句结束后,数组可能会被垃圾收集器移动,在该点之后访问指针将是不可预测的,但可能非常糟糕。

如果你打算在读取数组的同时更新它,那么简单的数组根本不合适。但问题缺乏足够的信息来建议针对这种情况的最佳方法。