c# - 调用 native 代码的多线程托管应用程序

标签 c# c++ multithreading

我有一个使用 ASP WebApi 的服务。每个 http 请求都会转换为一个线程,该线程需要执行一些数据操作(可能更改数据)。 API层是用C#写的,数据操作是用C++写的。 C# 层调用 native 库并提供指向某个托管缓冲区的指针。

几个问题:

  1. 如何确保不存在竞争?在这种情况下, native 库中的 std::mutex 是否足够? (托管线程是否映射到 native 线程?它们会共享相同的 std::mutex 吗?)

  2. 如何确保 GC 不会在 native 库操作托管缓冲区时释放指向托管缓冲区的指针?

最佳答案

  1. 你需要一个共享缓冲区吗?如果缓冲区只在一个线程上使用,您就可以省去很多麻烦。托管线程不会 1:1 映射到 native 线程,但我不确定这是否对您的方案有任何影响。
  2. 您需要修复缓冲区,并在 native 代码有指向它的指针的整个过程中保持其固定 - 释放是您最不担心的事情,.NET 内存一直在移动。这是使用 fixed block 完成的。

修复托管内存:

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# - 调用 native 代码的多线程托管应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30347128/

相关文章:

c# - 更改 MAUI Blazor 混合应用程序中的 Windows 托盘图标 - 找不到 OnNativeMessage 定义

c# - [DebuggerDisplay(...)] 属性有用的示例?

c# - WPF- TextBlock 中的 "LineSpacing"

c++ - 在没有信道数据包丢失的传输中未收到数据包的原因?

javascript - 如何延长响应超时默认时间?

java - 将 add() 和 take() 元素添加到 BlockingQueue 时死锁

c# - asp.net 应用程序在本地主机上识别用户,但在没有硬编码用户名/密码的情况下无法在服务器上识别用户

C++ 静态变量在 Release模式下初始化错误

c++ - 为什么按值传递而不是按常量引用传递?

linux - 条件变量和rwlock死锁