Boost.Coroutine 不使用分段堆栈
Boost.Coroutine not using segmented 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);
}
用 -fsplit-stack
编译该代码解决了问题。注释不是必需的。默认情况下,所有函数都被视为拆分堆栈。示例 - https://wandbox.org/permlink/Pzzj5gMoUAyU0h7Q
就这么简单。
使用 b2 属性 segmented-stacks=on 编译 boost(boost.context 和 boost.coroutine)(在 中启用特殊代码=32=] 和 boost.context).
您的应用程序必须使用 -DBOOST_USE_SEGMENTED_STACKS
和 -fsplit-stack
进行编译(boost.coroutines headers 要求)。
boost.coroutine 包含一个演示分段堆栈的示例
(在目录 coroutine/example/asymmetric/ 中调用 b2 toolset=gcc segmented-stacks=on
)。
请注意:虽然 llvm 支持分段堆栈,但 clang 接缝不提供 __splitstack_<xyz>
功能。
谁能给我一个例子,说明如何将分段堆栈与 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);
}
用 -fsplit-stack
编译该代码解决了问题。注释不是必需的。默认情况下,所有函数都被视为拆分堆栈。示例 - https://wandbox.org/permlink/Pzzj5gMoUAyU0h7Q
就这么简单。
使用 b2 属性 segmented-stacks=on 编译 boost(boost.context 和 boost.coroutine)(在 中启用特殊代码=32=] 和 boost.context).
您的应用程序必须使用 -DBOOST_USE_SEGMENTED_STACKS
和 -fsplit-stack
进行编译(boost.coroutines headers 要求)。
boost.coroutine 包含一个演示分段堆栈的示例
(在目录 coroutine/example/asymmetric/ 中调用 b2 toolset=gcc segmented-stacks=on
)。
请注意:虽然 llvm 支持分段堆栈,但 clang 接缝不提供 __splitstack_<xyz>
功能。