问题标签 [boost-coroutine]

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 投票
2 回答
4326 浏览

c++ - boost asio 和 coroutine2 示例

在阅读文档时,coroutine2我发现了一段很好的代码片段,展示了如何使用它asio

以下是文档中的代码供参考:

但是我在 asio 文档上找不到工作示例,并且尝试在 coliru 上编译此代码段会给我与相关的编译器错误yield

您是否知道coroutine2上面示例中使用的最小客户端/服务器实现?

0 投票
1 回答
5836 浏览

c++ - Unable to link against boost libraries

I can't get my g++ to compile and link a minimal boost co-routine program (and I guess other components as well) on my machine.

I used apt-get to install boost (libboost-all-dev), but neither

nor

works. g++'s output is as follows:

Some more information about my environment:

Compiler: have tried both g++ (v. 4.8.2) and g++-5

Distro: Ubuntu 14.04.1 LTS

0 投票
1 回答
928 浏览

asynchronous - 如何使 C++ 异步编程更线性(协程?)

在 C++14 中,我想构建一种机制,以“顺序”方式使用异步 API,使用单个线程

更明确地说,我想实现这样的目标:

我的程序应该同时运行多个脚本,每个脚本应该是一系列标准函数调用(SyncOpX)。这些脚本可以并行运行,因为SyncOpX是根据异步函数(即,在 I/O 完成时启动 I/O 操作、返回和调用回调的函数)实现的。

当然,使用多个线程很容易找到解决方案(Spawn创建一个新线程并SynchOpX等待异步调用的结果)。但我正在寻找一个单线程解决方案,而不是。

我认为协程可以以某种方式使用。既然目前的标准是C++14,有没有解决办法boost coroutines呢?还是使用任何其他 [便携式] 机制?

顺便说一句:我正在使用boost::asio异步 I/O。

谢谢。

0 投票
1 回答
546 浏览

c++ - 如何使协程始终在同一个线程中工作?

我想接受线程 0 中的连接,然后将此套接字发布到其他线程之一(1-31)以进行负载平衡,然后我希望通过使用协程,使用此套接字的所有其他操作都将在同一个线程中 -避免线程间上下文切换g.

  • 我想使用io_service++在不同的线程上执行异步回调以进行负载work平衡vector<boost::thread>

  • 但同时我想通过只在同一个线程中使用协程来使用这个套接字执行所有其他操作——没有负载平衡和快速上下文切换。

如果我通过 using 使用 boost.coroutine1boost::asio::spawn()那么协程可以在不同的线程上交替执行吗?

如果可以,那么如何使协程的回调始终在调用异步操作的同一线程中执行,即使io_service绑定了许多线程(线程池)?

众所周知,协程之间的切换非常快,在 x86_64 上大约需要10-12 ns :http: //www.boost.org/doc/libs/1_64_0/libs/coroutine/doc/html/coroutine/performance.html

但这仅在协程切换发生在单个线程中时才成立。因为线程切换花费了超过 100 ns

那么如何让协程始终在同一个线程中工作呢?

0 投票
1 回答
1805 浏览

c++ - 分段堆栈如何工作

分段堆栈如何工作?这个问题也适用,Boost.Coroutine所以我在这里也使用 C++ 标签。主要的疑问来自这篇文章看起来他们所做的是在堆栈底部保留一些空间,并通过向那里分配的内存注册某种信号处理程序来检查它是否已损坏(可能是通过mmapmprotect?)然后当他们检测到空间不足时,他们会继续分配更多内存,然后从那里继续。关于这个的3个问题

  1. 这不是构建用户空间的东西吗?他们如何控制新堆栈的分配位置以及如何编译程序指令以了解这一点?

    一个 push 指令基本上只是向堆栈指针添加一个值,然后将该值存储在堆栈上的寄存器中,那么 push 指令如何知道新堆栈的开始位置以及相应的 pop 如何知道何时必须将堆栈指针移回旧堆栈?

  2. 他们还说

    在我们得到一个新的堆栈段后,我们goroutine通过重试导致我们用完堆栈的函数来重新启动

    这是什么意思?他们会重新启动整个 goroutine 吗?这不会导致不确定的行为吗?

  3. 他们如何检测到程序已经溢出堆栈?如果他们在底部保留一个金丝雀式的内存区域,那么当用户程序创建一个足够大的数组时会发生什么溢出呢?这不会导致堆栈溢出并且是潜在的安全漏洞吗?

如果 Go 和 Boost 的实现不同,我很高兴知道它们中的任何一个如何处理这种情况

0 投票
1 回答
353 浏览

c++ - 使用 boost coroutine2 的意外输出

这是测试用例

由于某种原因,最后的断言失败,总和的值是14 我用命令安装了 boost(版本 1.63)上下文

我在 MacOS 上运行它10.12.6。编译命令是

boost从 sourceforge 下载的 boost 文件夹在哪里。

上面测试用例的输出奇怪的assert是没有

为什么在协程中打印第一行Currently 0?另外为什么Currently 2在这里打印两次?后者也可以在这里看到https://wandbox.org/permlink/zEL9fGT5MrzWGgQB


对于第二个问题,似乎在主线程完成后,最后一次将控制权转移回协程。这是为什么?好像很奇怪。。

更新:对于第二个问题,boost 1.65 似乎有所不同??!?https://wandbox.org/permlink/JQa9Wq1jp8kB49Up

0 投票
2 回答
433 浏览

c++ - Boost.Coroutine 不使用分段堆栈

谁能给我一个示例,说明如何将分段堆栈与 boost 协程一起使用?split-stack我是否必须用特殊属性 注释从协程调用的每个函数?

当我尝试编写一个应该使用分段堆栈的程序时,它只是段错误。


这是我到目前为止所做 的事情https://wandbox.org/permlink/TltQwGpy4hRoHgDY 代码似乎很快就会出现段错误,如果使用分段堆栈,我希望它能够处理更多迭代。程序在 35 次迭代后出错。

0 投票
2 回答
1952 浏览

c++ - 如何在大型项目中使用 -fsplit-stack

我最近发布了一个关于堆栈分段和提升协程的问题, 但似乎 -fsplit-stack 方法仅适用于使用该标志编译的源文件,当您分支到另一个尚未编译的函数时,运行时会中断 - fsplit 堆栈。例如_

这意味着运行时使用函数本地技术来检测当前堆栈何时被超越。而不是“保护页面信号”技巧,堆栈的末尾总是有一个保护页面,它将在写入或读取时发出信号,告诉运行时分配一个新的堆栈帧并分支到那个。

那么这个flag有什么用呢?如果我链接到任何其他尚未使用此构建的库,代码将中断(甚至是 libstdc++ 和 libc),那么人们如何在大型项目中实际使用它?


通过阅读有关拆分堆栈的gcc wiki,似乎从拆分堆栈函数调用非拆分堆栈函数会导致分配 64KB 堆栈帧。好的。

但似乎尚未实现从函数指针调用非拆分堆栈函数以遵循上述方案。

那这个flag有什么用呢?如果我继续调用任何虚函数,我的程序会中断吗?

下面的答案来看,clang 似乎还没有实现拆分堆栈?

0 投票
1 回答
1454 浏览

c++ - 如何将 error_code 设置为 asio::yield_context

我想创建一个异步函数,它的最后一个参数是 boost::asio::yield_context。例如:

我也想与 Asio 如何返回错误代码保持一致。也就是说,如果用户这样做:

并且函数失败,然后它抛出system_error异常。但如果用户这样做:

然后 - 而不是抛出 - 错误在ec.

问题是在实现该功能时,我似乎无法找到一种干净的方法来检查是否使用了 operator[] 并设置它。我们想出了这样的事情:

但这很棘手,因为yield_context::ec_它被声明为私有(尽管仅在文档中)。

我能想到的另一种方法是将yield对象转换为asio::handler_type并执行它。但这个解决方案充其量似乎很尴尬。

还有其他方法吗?

0 投票
1 回答
594 浏览

c++ - 使用 boost future 来提升协程

我正在尝试制作具有协程结果的地图。
我搜索了一个示例,展示了如何获得协程的未来。
之后我需要生成任务以将它们与 asio 一起使用。
这是协程的代码:

这部分代码显示了我需要完成未来任务的方式。
它基于 python 获取协程期货的方式。
我不明白如何在 C++ 中做到这一点。
我部分使用了 asio,但为了使用 for 循环,我想制作将包含在 for 循环中的协程,并且它的异步函数将在 asio 服务中运行。
我不知道我的想法是否正确。我特别需要的是一个如何制作协程期货容器的例子......