【问题标题】:Sharing a boost::asio::io_service object between dynamically loaded libraries在动态加载的库之间共享 boost::asio::io_service 对象
【发布时间】:2011-01-26 10:53:29
【问题描述】:

首先我做了什么(如果不只是我做一些愚蠢的事情,将提供最低限度的样本):

我有一个 GUI 应用程序,它应该支持多个网络接口来更改 GUI 中显示的内容。网络接口被实现为在 GUI 启动时动态加载的插件。 GUI 应用程序提供了一个 boost::asio::io_service 对象,它通过对接口的引用传递,以便他们可以使用它来构建异步 I/O。在 GUI 线程中,这个 io_service 对象被轮询以同步网络接口对内容的访问。

现在的问题是处理程序在轮询时不会被 io_service 对象调用。为了缩小这个范围,我只实现了一个接口并在其中创建了 io_service 对象,仍然从 GUI 线程调用轮询并且工作正常。

我现在的问题是:将 io_service 对象传递给在运行时加载的 DLL 函数是否可能存在一般问题?

如果场景太不清楚,我将提供一个最简单的示例。

编辑:我觉得真的很愚蠢 :) 只是拼凑了一个最小的例子,这 - 当然 - 就像一个魅力。这几乎意味着问题源于软件的其他部分。

感谢大家的意见!

为了让这个问题至少有点用处: 任何想做类似事情的人(通过 boost::asio::io_service 同步的网络插件),您可以下载最小示例here

【问题讨论】:

  • 场景很清楚,但举个例子肯定会有所帮助。
  • 任意数量的 DLL 使用相同的 io_service 没有任何问题,更重要的是,它可以被任意数量的线程使用(如果您知道自己在做什么)。所以请提供启动异步操作和轮询的示例
  • 是的,好像我在其他时候犯了一些错误。这种情况应该可以正常工作。

标签: c++ boost dll boost-asio


【解决方案1】:

我会检查几个选项:
* 也许对象在某个时候被复制而不是通过引用传递;您可以将其设置为 boost::noncopyable 以防止这种情况发生。
* 检查 poll 的返回值是否大于 0 某个处理程序已运行;如果为 0,则问题是 boost 认为没有处理程序。
* 在您的 GUI 应用程序中添加一个测试处理程序以排除它是 DLL 相关问题的选项。

调试愉快!

【讨论】:

  • 由于该场景没有普遍问题,我只需要更好地调试我的软件,我将把它标记为正确答案。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 2011-06-16
相关资源
最近更新 更多