Boost.Coroutine не использует сегментированные стеки

Может ли кто-нибудь дать мне пример того, как я могу использовать сегментированные стеки с сопрограммами повышения? Нужно ли аннотировать каждую функцию, вызываемую из сопрограммы, специальным split-stack атрибут?

Когда я пытаюсь написать программу, которая должен используйте сегментированные стеки, это просто segfaults.


Вот что я сделал до сих пор
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);
}

3

Решение

Компиляция этого кода с -fsplit-stack решает проблему. Аннотации не требуются. Все функции по умолчанию рассматриваются как разделенные стеки. Пример — https://wandbox.org/permlink/Pzzj5gMoUAyU0h7Q

Легко как то.

3

Другие решения

увеличить компиляцию (boost.context и boost.coroutine) со свойством b2 Географическая-стеки = на (включает специальный код внутри 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 содержит пример, демонстрирующий сегментированные стеки
(в каталоге сопрограмма / пример / асимметричная / вызов b2 toolset=gcc segmented-stacks=on).

пожалуйста, обратите внимание: пока llvm поддерживает сегментированные стеки, лягушатые швы не обеспечивают __splitstack_<xyz> функции.

0

По вопросам рекламы [email protected]