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

pinvoke: Threads vs shared memory buffer

在SO上读取了多个post之后,我需要在C#端预分配我的内存缓冲区,将它传递给本机端所以当函数returns内存中的值缓冲区将被正确填充(这避免了数据的多个副本)。

参见:

这基本上是:

[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

How can I make sure this function will be thread-safe ?

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

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

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

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