调用本机代码的多线程托管应用程序
Multi-threaded managed application that calls native code
我有一个使用ASP WebApi的服务。每个http请求都转换为需要执行一些数据操作(可能会更改数据)的线程。API层是用c#编写的,数据操作是用c++编写的。c#层调用本机库并提供指向托管缓冲区的指针。
几个问题:
-
我如何确保没有比赛?在这种情况下,本地库中的
std::mutex
是否足够?(托管线程映射到本机线程吗?他们会共享同一个std::mutex
吗?) -
我怎么能确保GC不释放指针到托管缓冲区,而本机库正在操纵它?
- 你需要一个共享的缓冲区吗?如果缓冲区只在一个线程上使用,就可以省去很多麻烦。托管线程不以1:1的比例映射到本机线程,但我不确定这是否对您的场景有任何影响。
- 你需要修复缓冲区,并且在本机代码有指向它的指针的整个过程中保持它的固定-释放是你最不担心的,. net内存一直在移动。这是使用
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
。
相关文章:
- 通过安装信号处理程序关闭多线程应用程序
- 多线程 gtkmm 应用程序最简单的示例
- 将数组作为多线程应用程序中函数的返回传递
- 修改多线程应用程序中的对象
- 多线程 C++11 应用程序中的同步
- 多线程Windows GUI应用程序中的死锁
- C++多线程应用程序将永远挂起
- 具有多线程应用程序的 Nanomsg 无阻塞双向套接字
- 在接收 SIGINT 操作时适当地关闭多线程 c++ 应用程序
- 如何在多线程应用程序中获得花费的时间
- Linux VM(重型多线程应用程序)的性能改进
- C 多线程崩溃应用程序
- 在C 多线程应用程序中,设置了并发线程的最大数量
- C++多线程应用程序崩溃
- 如何在 Mac 上的 C++ 应用程序中使用多线程?
- 多线程应用程序中的零MQ处理中断
- 使用C 的多线程应用程序中测量全局时间(壁挂)的最快方法
- 如何在多线程应用程序中使用 pybind11
- C++应用程序多线程中的锁定方法
- PPL任务-桌面应用程序UI线程中的延续