Как правильно использовать контекст повышения

Я хочу реализовать систему заданий для моего игрового движка, используя волокна. После поиска в интернете хорошей реализации с ++ волокон, я обнаружил, что Boost.Context хорошая отправная точка.

Обновление 1: Я хочу реализовать свой собственный алгоритм планирования, таким образом, Boost.Fiber, Boost.Coroutine, Boost.Coroutine2 не подходят для моей реализации.

После компиляции boost для архитектуры x64 и попытки запустить базовый пример из boost документация Я получил следующее исключение:

boost :: context :: detail :: принудительное_unwind в ячейке памяти

Вот код, который я пытался запустить (Visual Studio 2015 Enterprise Edition, Windows 7):

#include <iostream>
#include <boost\context\continuation.hpp>
namespace ctx=boost::context;
int main()
{
ctx::continuation source=ctx::callcc
(
[](ctx::continuation && sink)
{
int a=0;
int b=1;
for(;;)
{
sink=sink.resume(a);
auto next=a+b;
a=b;
b=next;
}
return std::move(sink);
}
);
for (int j=0;j<10;++j) {
std::cout << source.get_data<int>() << " ";
source=source.resume();
}
return 0;
}

Код работал правильно (правильный вывод: 0 1 1 2 3 5 8 13 21 34 55), но когда он закончил выполнение, я получил исключение.

Обновление 2: исключение происходит только для сборки выпуска

Я хочу задать два вопроса относительно контекста повышения:

1) Что вызвало исключение при размотке стека и как его избежать?

2) Я нашел документацию по надстройке немного поверхностной и не смог найти другого учебника по использованию контекста надстройки. Вы можете направить меня
к хорошим источникам / учебникам о повышении контекста?

3

Решение

Во-первых, исключение принудительного размотки задокументировано (и это то, что дает контексту поддержку RAII).

Во-вторых, если вы хотите, чтобы Fibers строились на Boost Context, используйте существующие библиотеки:

Обновить:

Тестирование с Boost 1.64.0 на Microsoft (R) C / C ++ Оптимизирующая версия компилятора 19.00.24215.1 для x64 У меня есть не удалось воспроизвести поведение:

введите описание изображения здесь

0

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

После возврата 0 исходный объект не находится в позиции, которая должна быть уничтожена.

Что-то вроде:

namespace ctx = boost::context;
int a;
bool stop = false;
{
ctx::continuation source = ctx::callcc(
[&stop, &a](ctx::continuation && sink) {
a = 0;
int b = 1;
for (;;) {
sink = sink.resume();
if (stop)
break;
int next = a + b;
a = b;
b = next;
}
return std::move(sink);
});
for (int j = 0; j < 10; ++j) {
std::cout << a << " ";
source = source.resume();
}
stop = true;
source.resume();
}
0

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