Я хочу реализовать систему заданий для моего игрового движка, используя волокна. После поиска в интернете хорошей реализации с ++ волокон, я обнаружил, что 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) Я нашел документацию по надстройке немного поверхностной и не смог найти другого учебника по использованию контекста надстройки. Вы можете направить меня
к хорошим источникам / учебникам о повышении контекста?
Во-первых, исключение принудительного размотки задокументировано (и это то, что дает контексту поддержку RAII).
Во-вторых, если вы хотите, чтобы Fibers строились на Boost Context, используйте существующие библиотеки:
Тестирование с Boost 1.64.0 на Microsoft (R) C / C ++ Оптимизирующая версия компилятора 19.00.24215.1 для x64 У меня есть не удалось воспроизвести поведение:
После возврата 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();
}