在阅读了多篇关于 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
。
答案 0 :(得分:0)
我怎样才能确保这个函数是线程安全的?
与确保所有其他函数都是线程安全的方式相同。
当 fillArrayNative
运行时,它可能对数组具有独占访问权限。如果方法在内部使用线程,则由方法本身来执行任何必要的同步。
一旦 fillArrayNative 返回,它可能不再访问数组。如果它确实保存指针供以后使用,那么您将面临的不仅仅是线程问题。 fixed
语句结束后,数组可能会被垃圾收集器移动,在该点之后访问指针将是不可预测的,但可能非常糟糕。
如果你打算在读取数组的同时更新它,那么简单的数组根本不合适。但问题缺乏足够的信息来建议针对这种情况的最佳方法。