在多线程程序中,每个线程都拥有一块独立的栈,这块栈是其他线程无法访问的私有资源。

因此,存储在该栈中的局部变量无需考虑线程同步问题。但若该局部变量涉及 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,启动 100 个线程后,任务管理器中的内存占用大约为 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