Я использую Boost Context 1.67 для создания волокна (fcontext API).
с минимально возможным размером стека в Windows 10.
Возможно, эта проблема связана не только с повышением контекста, но и с любым сценарием, в котором мы используем поток Windows с минимальным размером стека.
Я столкнулся с проблемами при использовании очень маленьких стеков (до 10 КБ)
через исключения stackoverflow, которые вызваны внутренним
исключение стека разматывания, выданное контекстом повышения, как показано ниже:
При использовании стека большего размера (> 10 кб) проблем не возникает.
Для воспроизведения достаточно следующего примера:
#include <memory>
#include <utility>
#include <boost/context/all.hpp>
#define STACK_SIZE 8000
struct my_allocator
{
boost::context::stack_context allocate()
{
void* memory = std::malloc(STACK_SIZE);
return {STACK_SIZE,
static_cast<char*>(memory) +
STACK_SIZE};
}
void deallocate(
boost::context::stack_context& context)
{
std::free(static_cast<char*>(context.sp) -
STACK_SIZE);
}
};
int main(int, char**)
{
boost::context::fiber fiber(
std::allocator_arg, my_allocator{},
[](boost::context::fiber&& sink) mutable {
// ...
return std::move(sink);
});
// Will cause a stack unwind exception and
// reproduces the issue
return 0;
}
Повышающий контекст используется здесь только для выполнения переключения контекста с выделенным пользователем стеком, вероятно, проблема вызвана некоторыми ограничениями исключений MSVC C ++, которые, вероятно, требуют определенного минимального размера стека для работы. Кроме того, SetThreadStackGuarantee
функция WinAPI не влияет на проблему.
Стек распределяется через malloc, как показано в примере.
Можно ли использовать в Windows стеки меньшего размера, чем 10 КБ, при использовании исключений C ++? Какие обстоятельства могут быть причиной ограничения здесь?