Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Windows上使用C++;异常(使用boost上下文光纤)_C++_Windows_Boost_Fiber_Boost Context - Fatal编程技术网

C++ 在Windows上使用C++;异常(使用boost上下文光纤)

C++ 在Windows上使用C++;异常(使用boost上下文光纤),c++,windows,boost,fiber,boost-context,C++,Windows,Boost,Fiber,Boost Context,我正在使用boost context 1.67创建光纤(FContextAPI) 在Windows 10上使用尽可能小的堆栈大小 这个问题可能不仅仅局限于boost上下文,而且适用于我们使用具有最小堆栈大小的Windows线程的任何场景 我在使用非常小的堆栈(低于10kb)时遇到问题 内部错误导致的贯穿堆栈溢出异常 boost上下文引发堆栈展开异常,如下所示: 当使用更大的堆栈(>10KB)时,我不会遇到任何问题 对于复制,以下示例已足够: #include <memory> #i

我正在使用boost context 1.67创建光纤(FContextAPI) 在Windows 10上使用尽可能小的堆栈大小

这个问题可能不仅仅局限于boost上下文,而且适用于我们使用具有最小堆栈大小的Windows线程的任何场景

我在使用非常小的堆栈(低于10kb)时遇到问题 内部错误导致的贯穿堆栈溢出异常 boost上下文引发堆栈展开异常,如下所示:

当使用更大的堆栈(>10KB)时,我不会遇到任何问题

对于复制,以下示例已足够:

#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;
}
#包括
#包括
#包括
#定义堆栈大小8000
结构我的分配程序
{
boost::context::stack_context allocate()
{
void*memory=std::malloc(堆栈大小);
返回{STACK_SIZE,
静态_转换(内存)+
堆栈大小};
}
无效解除分配(
boost::context::stack_context和context)
{
std::free(静态_cast(context.sp)-
堆栈大小);
}
};
int main(int,char**)
{
boost::context::光纤(
std::分配器参数,我的分配器{},
[](boost::context::光纤和接收器)可变{
// ...
返回标准::移动(水槽);
});
//将导致堆栈展开异常和
//复制问题
返回0;
}

Boost上下文仅用于执行用户分配堆栈的上下文切换,可能是由于MSVC C++异常的某些限制而导致的,这可能需要一定的最小堆栈大小来工作。另外,

setThreadStackGuarrance
WinAPI函数对该问题没有任何影响

堆栈通过malloc分配,如示例所示


在使用C++异常时,在Windows上使用较小的堆栈是否比10kb更可能?以下哪种情况可能导致限制?

不幸的是,Windows API没有提供返回最小重新需要的堆栈空间的函数或常量

仅32位Windows异常(SEH)会导致堆栈上出现条目。 Win x64使用基于表的异常处理-异常处理程序的条目存储在pdata部分。 因此,x64上的异常处理不应影响最小堆栈空间。 x64调用约定需要一些空间-例如32字节的“阴影空间”+XMM寄存器的空间。。。但存储寄存器只需要几个字节

我猜最小堆栈空间受到“指令插入代码”(例如堆栈cookies等)的限制-这可能由编译器标志控制

boost.context分配内存并将其用作堆栈(+实现上下文切换)。 boost.fiber使用boost.context中的堆栈,并在每个光纤堆栈的顶部为控制结构保留空间(新位置)(但这小于1kB)


您可以选择使用间隔嵌套来测试应用程序所需的最小堆栈空间。

在windows系统中,为@RbMm分配不小于64 KB的空间。是否有此限制的参考?例如,Go语言默认使用2kb(自动增长)堆栈(可能在Windows上也是如此),但我粘贴引用。2kb堆栈在原则上不可使用。页面大小为4kbAs@RbMm,系统将堆栈大小四舍五入为64Kb的倍数。。见链接。您可以使用GetCurrentThreadStackLimits查看那里发生了什么,尝试在有/无Boost和有/无异常的情况下调用此函数,以查看瓶颈在哪里。@AndreiM系统如何将用户提供的堆栈四舍五入到64kb?我改变了示例,以反映堆栈是通过malloc分配的(可以由诸如jemalloc之类的分配器支持)。可能整个代码将在用户空间中执行,并且不会导致任何系统调用,因为上下文切换是无效的。