首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >托管线程是否可以调用调用boost asio async_write的C++方法

托管线程是否可以调用调用boost asio async_write的C++方法
EN

Stack Overflow用户
提问于 2013-02-16 07:32:43
回答 1查看 407关注 0票数 0

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-16 08:40:52

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

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

所以使用boost::asio是很好的,没有任何问题。就像托管程序可以执行本机代码的许多其他方式一样,包括操作系统调用。您需要注意的唯一细节是确保在编译代码时不使用有效的/clr。将boost代码编译成IL运行良好,只是效率不是很高。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14905104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档