我有一个使用ASP WebApi的服务。每个http请求都转换为需要执行一些数据操作的线程(可能会更改数据)。 API层是用C#编写的,数据操作是用C++编写的。 C#层调用本地库并提供指向某个受管缓冲区的指针。调用本地代码的多线程托管应用程序
几个问题:
我怎样才能确保有没有比赛?本地库中的
std::mutex
足够在这种情况下? (做管理线程映射到本地线程吗?它们将共享相同的std::mutex
?)如何确保GC在本机库正在操作时不释放指向托管缓冲区的指针?
我有一个使用ASP WebApi的服务。每个http请求都转换为需要执行一些数据操作的线程(可能会更改数据)。 API层是用C#编写的,数据操作是用C++编写的。 C#层调用本地库并提供指向某个受管缓冲区的指针。调用本地代码的多线程托管应用程序
几个问题:
我怎样才能确保有没有比赛?本地库中的std::mutex
足够在这种情况下? (做管理线程映射到本地线程吗?它们将共享相同的std::mutex
?)
如何确保GC在本机库正在操作时不释放指向托管缓冲区的指针?
fixed
块完成的。定影管理内存:
byte[] theBuffer = new byte[256];
fixed (byte* ptr = &theBuffer[0])
{
// The pointer is now fixed - the GC is prohibited from moving the memory
TheNativeFunction(ptr);
}
// Unfixed again
但是请注意,从各地移动存储禁止GC能引起你不少麻烦 - 它可以防止堆压缩干脆在高吞吐量的服务器,例如。
如果您不需要在托管环境中使用内存,则可以简单地为该任务分配非托管内存,例如使用Marshal.AllocHGlobal
。
你在做什么,到目前为止你尝试过什么?你为什么要缓冲区被管理? C#和C++都会操纵那个缓冲区吗?缓冲区是每个请求还是共享?什么是缓冲区? – Luaan
@Luaan我们正在尝试尽可能高效地处理大量数据。这就是我们决定用C++来处理它的原因。缓冲区被管理,因为我倾向于尽可能多地使用C#。只有C++操纵数据。缓冲区保存我们的应用程序发送给我们的遥测数据 – Shmoopy
好的......但这意味着只有在您从C#调用C++ interop方法时才会使用缓冲区,对不对?所以你可以处理锁定在C#级别,对吧?它甚至可能使下面的“固定”方法工作得很好,如果你不保留“固定”参考时间太长。 – Luaan