线程栈

梦想游戏人
目录:
C/C++

多线程中,每个线程拥有一个独立的栈,该栈是其他线程不能访问的私有资源,

所以存在于该栈中局部变量 是不需要考虑线程同步的问题,但是如果该局部变量是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

Scroll Up