【问题标题】:Can a managed thread call a C++ method that calls boost asio async_write托管线程可以调用调用boost asio async_write的C++方法吗
【发布时间】:2013-02-15 23:32:43
【问题描述】:

我正在用 C# 编写一个客户端,它与使用 boost asio 异步调用的 Windows C++ DLL 进行通信。我之前读过,ASIO 在托管环境中不能很好地工作。 VC++ DLL 是一个非托管项目,它为 I/O 处理程序创建一个非托管线程。 C# 代码创建一个后台线程来处理通过 pinvoke 向 C++ DLL 发送消息。我的问题是-对 boost::asio::async_write 方法的调用可以在托管线程上吗?或者,它必须在非托管线程上吗?

如果我可以在托管线程上调用 async_write,这将有助于简化逻辑和处理。但是,我担心当 .NET 垃圾收集器运行并停止线程时会发生什么。我不知道 ASIO 是否能够处理这个问题。我没有传递任何指向 C# 代码中定义的数据的指针,所以这应该不是问题。

【问题讨论】:

    标签: visual-c++ pinvoke boost-asio multithreading


    【解决方案1】:

    “托管线程”的概念很弱,操作系统只支持一种线程。运行托管代码的线程并不特殊,托管代码被翻译成与 C 编译器生成的完全相同的机器代码。唯一的区别是 CLR 知道线程并且有理由在垃圾回收发生时查看它的堆栈。需要查找可能包含对象引用的托管代码的堆栈帧。

    它不对属于本机代码的任何堆栈帧感兴趣,它只是忽略它们。是的,线程可能会在 GC 执行搜索时暂停,但前提是它当前正在执行托管代码。本机代码继续运行,如果 GC 正在进行,它只会在返回托管方法时阻塞。这种暂停与线程可能暂停的任何其他原因没有什么不同,包括在操作系统调度程序运行其他东西时失去处理器一段时间。

    所以使用 boost::asio 没问题,不会出错。就像托管程序可以执行本机代码的许多其他方式一样,包括操作系统调用。您需要注意的唯一细节是确保在没有 /clr 的情况下编译您的代码。将 boost 代码编译为 IL 可以正常工作,只是效率不高。

    【讨论】:

      猜你喜欢
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多