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
语句结束后,垃圾收集器可能会移动数组,并且在该点之后访问指针将不可预测,但可能非常糟糕。
如果你打算在读取数组的同时更新它,那么简单的数组是不合适的。但这个问题缺乏足够的信息来建议针对这种情况的最佳方法。
在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
语句结束后,垃圾收集器可能会移动数组,并且在该点之后访问指针将不可预测,但可能非常糟糕。
如果你打算在读取数组的同时更新它,那么简单的数组是不合适的。但这个问题缺乏足够的信息来建议针对这种情况的最佳方法。