问题标签 [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 投票
1 回答
827 浏览

c++ - boost协程在Windows x86_64上不起作用吗?

我编译了parallel.cpp附带boost::coroutines::coroutine32 位和 64 位程序的示例。

他们都编译和链接没有错误。32 位程序运行并按预期运行,但 64 位应用程序在启动时崩溃。

在 64 位 Windows 7 上使用 Visual Studio 2012 Express。

编辑:协程已被接受为 boost 但尚未作为 boost 分发的一部分发布。我使用了作者“最终”版本中的示例。

编辑:这是代码

0 投票
1 回答
703 浏览

c++ - Boost协程断言失败

为了在 boost 中尝试新的协程功能,我创建了以下程序:

该代码基于docs 中的示例代码

我的构建命令如下:

输出:

由于断言失败,程序被中止。你能帮我找出我的代码中的错误吗?

0 投票
1 回答
629 浏览

c++ - Boost::coroutine 示例不起作用

Boost 库有一个有趣的东西——协程。我尝试简单的示例阶乘但是错误:

factorial.cpp(35): error C2039: 'self' : is not a member of 'boost::coroutines::coroutine'

如何编译这个和其他例子?也许我不好安装 Boost ?我只复制 boost_1_55_0\boost 子目录

0 投票
1 回答
372 浏览

c++ - 使用 Boost Coroutine(1.55) 的分段错误不清楚?

我写了一段代码,它会得到一个Segmentation fault. 我不确定这是 Boost Coroutine 的错误还是我下面的代码:

test.txt非常大,因此在发生段错误之前它永远不会得到 eof。我使用 1.55 的 Boost 并且有一些观察:

  1. 段错误发生在line I
  2. 如果我在 yield 子句之前删除或移动f.close(),段错误就消失了。
  3. 如果我在代码中删除line J,段错误消失了。
  4. 如果我使用较小的数字而不是8192(比如 512),则段错误消失了。

这里有什么问题?

0 投票
2 回答
183 浏览

c++ - 如何在 Boehm GC 中使用 Boost.Coroutine?

Boost.Coroutine 分配自己的调用堆栈。Boehm GC 是否将这些堆栈上的指针视为根,如果不是,我怎样才能做到这一点?在上下文切换到协程后,Boehm 终止程序。

0 投票
2 回答
27612 浏览

c++ - 无堆栈协程与有堆栈协程有何不同?

背景:

我问这个是因为我目前有一个包含许多(成百上千)线程的应用程序。大多数这些线程大部分时间都处于空闲状态,等待将工作项放入队列中。当一个工作项可用时,它会通过调用一些任意复杂的现有代码来处理。在某些操作系统配置上,应用程序会遇到控制最大用户进程数的内核参数,因此我想尝试减少工作线程数量的方法。

我提出的解决方案:

这似乎是一种基于协程的方法,我用协程替换每个工作线程,这将有助于实现这一目标。然后,我可以拥有一个由实际(内核)工作线程池支持的工作队列。当一个项目被放置在特定协程的队列中进行处理时,一个条目将被放置到线程池的队列中。然后它将恢复相应的协程,处理其排队的数据,然后再次挂起它,释放工作线程来做其他工作。

实施细节:

在考虑如何做到这一点时,我无法理解无堆栈协程和堆栈协程之间的功能差异。我有一些使用Boost.Coroutine库使用堆栈协程的经验。我发现从概念层面理解起来相对容易:对于每个协程,它维护一份 CPU 上下文和堆栈的副本,​​当您切换到协程时,它会切换到保存的上下文(就像内核模式调度程序一样)。

我不太清楚的是无堆栈协程与此有何不同。在我的应用程序中,与上述工作项排队相关的开销非常重要。我见过的大多数实现,比如新的 CO2 库,都表明无堆栈协程提供了开销更低的上下文切换。

因此,我想更清楚地了解无堆栈和堆栈式协程之间的功能差异。具体来说,我想到了这些问题:

  • 像这样的参考文献表明,区别在于您可以在堆栈和无堆栈协程中产生/恢复的位置。是这样吗?有没有一个简单的例子可以说明我可以在堆栈式协程中但不能在无堆栈协程中执行的操作?

  • 使用自动存储变量(即“堆栈上”的变量)是否有任何限制?

  • 我可以从无堆栈协程调用哪些函数有任何限制吗?

  • 如果没有为无堆栈协程保存堆栈上下文,那么当协程运行时,自动存储变量会去哪里?

0 投票
1 回答
7693 浏览

c++ - boost::asio::spawn 有什么作用?

我无法想象控制流是如何随着 spawn 发生的。

  1. 当我调用spawn(io_service, my_coroutine)时,它是否会在io_service队列中添加一个新的处理程序来包装对my_coroutine?

  2. 当在协程中我调用一个异步函数传递它 myyield_context时,它会暂停协程直到异步操作完成吗?

    /li>

我不明白的是我们如何避免等待。假设如果my_coroutine服务于 TCP 连接,那么my_coroutine在特定实例挂起等待async_foo完成时,如何调用其他实例?

0 投票
1 回答
1382 浏览

c++ - 是什么导致 boost::coroutine 中的随机崩溃?

我有一个多线程应用程序,它通过在 boost::asio 中的集成使用boost :: asioboost::coroutine。每个线程都有自己的io_service对象。线程之间唯一共享的状态是连接池,当连接从/返回到连接池时被互斥锁锁定。当池中没有足够的连接时,我将无限asio::steady_tiemer推送到池的内部结构中并异步等待它,然后我从 couroutine 函数中让步。当其他线程返回连接池时,它会检查是否有等待定时器,它从内部结构中获取等待定时器,它获取它的io_service对象并发布一个 lambda,该 lambda 唤醒计时器以恢复暂停的协程。我在应用程序中有随机崩溃。我尝试调查valgrind的问题。它发现了一些问题,但我无法理解它们,因为它们发生在boost::coroutineboost::asio内部。这是我的代码和valgrind输出的片段。有人可以看到并解释问题吗?

这是调用代码:

这是prepare在衍生的 lambda 中调用的函数实现:

returnQuota函数是该类的纯虚方法,AvlRequestDataTravelportRequestData在我的所有测试中使用的类的实现如下:

这里是连接池的pushpop方法。

这是coroutineAsyncWait的实现。

最后是valgrind输出的第一部分:

==8189== 线程 41:
==8189== 大小为 8 的无效读取
==8189== 在 0x995F84: void boost::coroutines::detail::trampoline_push_void, void, boost::asio::detail::coro_entry_point , void (匿名命名空间)::executeRequests > >(std::vector<(匿名命名空间)::AvlRequestContext, std::allocator<(匿名命名空间)::AvlRequestContext> >&)::{lambda(boost::asio ::basic_yield_context >)#1}>&, boost::coroutines::basic_standard_stack_allocator > >(long) (trampoline_push.hpp:65)
==8189== 地址 0x2e3b5528 不是 stack'd, malloc'd 或(最近)自由的

当我使用带有调试器的valgrind时,它会在boost::coroutine库中trampoline_push.hpp中的以下函数中停止。

0 投票
1 回答
1350 浏览

c++ - 这种 boost::asio 和 boost::coroutine 使用模式有什么问题?

这个问题中,我描述了boost::asioboost::coroutine使用模式,这会导致我的应用程序随机崩溃,并且我从我的代码和valgrindGDB输出中发布了摘录。

为了进一步调查这个问题,我创建了应用相同模式的更小的概念证明应用程序。我看到我在此处发布的源代码较小的程序中也出现了同样的问题。

该代码启动了几个线程并创建了一个带有一些虚拟连接(用户提供的数字)的连接池。附加参数是无符号整数,它们扮演虚假请求的角色。函数的虚拟实现sendRequest只是启动异步计时器,等待秒数等于输入数,然后从函数中退出。

有人能看到这段代码的问题吗?他能提出一些解决办法吗?

以下是上述代码使用的一些辅助实用程序:

为了代码的完整性,最后缺少的部分是ConcurrentQueue类。在这里粘贴太长了,但是如果您愿意,可以在这里找到它。

该应用程序的示例用法是:

./connectionpooltest 3 3 5 7 8 1 0 9 2 4 3 6

其中第一个数字 3 是假连接数,第二个数字 3 是使用的线程数。后面的数字是虚假请求。

valgrindGDB的输出与上述问题中的相同。

使用的boost版本是1.57。编译器是GCC 4.8.3。操作系统为CentOS Linux release 7.1.1503

0 投票
1 回答
783 浏览

c++ - 如何正确使用带有 boost::coroutine 的类成员函数?

我目前正在与boost::asymmetric_coroutine. 假设我们在全局命名空间中有一个普通函数:

在这种情况下,我们可以通过以下方式使用此函数创建和执行协程:

我需要做的是以同样的方式使用类成员函数。据我了解,boost::bind应该以某种方式使用,但是,以下代码不起作用:

它引发的错误是

没有匹配的函数调用'get_pointer(const boost::coroutines::push_coroutine&)'

我该如何正确地做到这一点?