【问题标题】:Boost.Coroutine not using segmented stacksBoost.Coroutine 不使用分段堆栈
【发布时间】:2018-02-27 09:49:01
【问题描述】:

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

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


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

#include <boost/coroutine2/all.hpp>

#include <iostream>
#include <array>

using std::cout;
using std::endl;

class Int {
    int a{2};
};

void foo(int num) {
    cout << "In iteration " << num << endl;
    std::array<Int, 1000> arr;
    static_cast<void>(arr);
    foo(num + 1);
}

int main() {
    using Coroutine_t = boost::coroutines2::coroutine<int>::push_type;
    auto coro = Coroutine_t{[&](auto& yield) {
        foo(yield.get());
    }};

    coro(0);
}

【问题讨论】:

  • 您是否在将分段堆栈与 boost 协程一起使用时遇到了问题,或者您还没有写过尝试吗?
  • @TylerH 当我尝试导致堆栈溢出时,它只是发生了,不知道如何使用分段堆栈。通过阅读此处llvm.org/docs/SegmentedStacks.html 的文档,似乎函数需要特殊注释才能被视为“stacklets”,只是想要一个其他人如何完成此操作的示例
  • 我并不精通 C++,但我担心如果您正在寻找其他人的实现,这会使这个问题过于宽泛/主要基于意见(例如“如何 做”)。如果您可以通过实施尝试重新表述您的问题以显示特定问题/演示代码,那么提供有助于解决您遇到的问题的答案会更容易。
  • @TylerH 发布了一个例子,这就够了吗?
  • 谢谢;也许还可以编辑问题标题以更好地描述您所看到的问题?例如。 “为什么我的协程代码段错误如此之快”或其他内容,以更好地吸引浏览c++ 问题的人们的眼球。

标签: c++ c++11 boost boost-coroutine split-stacks


【解决方案1】:

使用 b2 属性 segmented-stacks=on 编译 boost(boost.context 和 boost.coroutine)(在 boost.coroutine 和 boost.context 中启用特殊代码)。

您的应用必须使用-DBOOST_USE_SEGMENTED_STACKS-fsplit-stack(boost.coroutines 标头要求)编译。

查看文档:http://www.boost.org/doc/libs/1_65_1/libs/coroutine/doc/html/coroutine/stack/segmented_stack_allocator.html

boost.coroutine 包含一个演示分段堆栈的示例 (在目录 coroutine/example/asymmetric/ 中调用 b2 toolset=gcc segmented-stacks=on)。

请注意:虽然 llvm 支持分段堆栈,但 clang 接缝不提供 __splitstack_&lt;xyz&gt; 函数。

【讨论】:

    【解决方案2】:

    使用-fsplit-stack 编译该代码可以解决问题。不需要注释。默认情况下,所有函数都被视为拆分堆栈。示例 - https://wandbox.org/permlink/Pzzj5gMoUAyU0h7Q

    就这么简单。

    【讨论】:

      猜你喜欢
      • 2011-09-06
      • 1970-01-01
      • 2018-02-25
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2011-10-30
      • 2023-03-12
      • 1970-01-01
      相关资源
      最近更新 更多