问题标签 [boost-fiber]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
244 浏览

c++ - 使用带有 boost asio 的光纤时 boost::fiber::yield 和 boost::fiber:sleep_for 之间的区别

我正在尝试使用 Fiber 进行 boost asio 的试验,发现在使用 fiber示例中提供的轮询 asio 调度程序时,它的行为似乎有所boost::this_fiber::yield()不同。boost::this_fiber::sleep_for(x)

设置是我们有一个线程创建两个无限循环的纤维:

  1. Fiber 1 使用带有野兽 websocket 的异步读取。
  1. 光纤 2 只是循环和输出。

使用此设置,实际上不会发生任何 websocket 读取,因为我们永远不会在async_read. 但是,如果我们将光纤 2 切换为

我们现在可以打印出 websocket 读取。奇怪的是,如果我们将 sleep_for 时间减少到一个较低的数字,例如std::chrono::nanoseconds(1),则不再发生读取。

为什么会出现这种行为?这是轮询 asio 调度程序的一个微妙之处吗?我的假设是,Fiber 2boost::this_fiber::yield()会以某种方式阻止 io_context 运行任何完成处理程序,但我很不确定。

谢谢!

编辑:

可以在此处找到一个带有 asio 异步计时器的自包含示例,它表现出相同的行为。

0 投票
0 回答
18 浏览

mariadb - C 的 MariaDB 异步 API 是否与 boost::fibers 兼容

我正在尝试在 Windows 下严重依赖 boost::fibers 的应用程序中使用 MariaDB async API for C。很难提供一个有效的例子,我希望有人在试图找出问题之前知道它是否应该工作。

会发生什么 - 在任何启动/继续函数被调用一次之后(从普通线程或从 boost 光纤)尝试从光纤再次调用它在 MariaDB 客户端代码中失败

在 SwitchToFiber 通话中。有趣的观察 - 显然 IsThreadAFiber() 返回 true,但 GetCurrentFiber() 在此时返回 NULL。

当使用非阻塞 API 时一切正常,当运行没有纤程的异步 API 时一切正常。

谢谢你的帮助,