【Windows核心编程笔记】第十六章 线程栈

    xiaoxiao2025-04-27  30

    每个线程都有自己的栈(一块地址空间区域),默认是1MB并调拨两个页面的存储器,这个值可以通过编译器配置修改,也可以在创建线程的时候通过参数指定(0为默认)

    系统永远不会给区域底部的那个页面调拨存储器(保护进程使用的其他数据)

     

    如果线程在栈溢出后继续使用栈,系统会抛出访问违规异常。如果访问违规异常是线程试图访问栈时引发的,此时系统会弹框提示并退出整个进程

    应该使用SetThreadStackGuarante避免此情况,抛出EXCEPTOU_STACK_OVERFLOW,使程序能够处理栈溢出并恢复运行

     

    栈下溢,代码会试图访问线程之外的内存,应该尽力避免

    Void func()

    {

           BYTE aBytes[100];

           aBytes[10000]=0; //栈下溢

    }

     

    C/C++运行库的栈检查函数

    确保已经给线程栈调拨了物理存储器,编译器会在必要时生成代码来调用栈检查函数

    /Gs开关 控制页面大小的阈值(绝大多数情况下不必设置)

    最新回复(0)