Boost.Coroutine不使用分段堆栈

时间:2017-09-18 18:58:14

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

有人能举例说明我如何使用带有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);
}

2 个答案:

答案 0 :(得分:3)

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

很容易。

答案 1 :(得分:0)

使用b2属性编译boost(boost.context和boost.coroutine) segmented-stacks = on (启用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 / call b2 toolset=gcc segmented-stacks=on)。

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