线程栈
多线程中,每个线程拥有一个独立的栈,该栈是其他线程不能访问的私有资源,
所以存在于该栈中局部变量 是不需要考虑线程同步的问题,但是如果该局部变量是RAII 那就要考虑了。
(线程是和进程共享资源的,可能只有一些很小的独立资源(如程序计数器,一组寄存器和栈),但是dll是堆栈独立的,所以dll里建立的线程可能情况不一样)
void worker() { // char a[4096000]; char a[1024*924]; while (true) Sleep(5000); } int main() { for (int i = 0; i < 100; i++) { // worker(); std::thread t(worker); t.detach(); cout << "thread ok " << i << endl; } while (true) { Sleep(1000); } system("pause"); return 0; }
从多线程的用途来看,彼此的栈也应该独立,VS中设置页的 堆栈保留大小 指的是 每个线程的栈最大增长大小,默认1M ,上面代码不会栈溢出,因为是每个线程最大1M 所以运行后任务管理器 内存大概是90+MB
每个线程退出后,栈就被释放了。
函数的调用栈也是一样的,
该线程的栈会在函数return后释放,如果是其他线程终止该线程那么不会释放,导致泄露
(A stack is freed when its thread exits. It is not freed if the thread is terminated by another thread.)
关于线程栈大小 的MSDN解释
https://msdn.microsoft.com/zh-cn/library/windows/desktop/ms686774.aspx