验证线程栈在堆区还是栈区?
看了这篇文章 Linux中的进程栈和线程栈 说主线程生成的子线程的 stack 区是用 mmap 系统调用映射到进程的堆区。于是实践验证一下,代码如下。
void* threadFunction(void* args) {
int a = 10;
// 线程的局部变量
cout <<"&a : " << (&a) << endl; // 0x7f07356ace44
getchar();
return nullptr;
}
int main() {
int b = 10;
int *p = new int(10);
// 主线程的局部变量,应该在栈区
cout <<"&b : " << (&b) << endl; // 0x7fff99371a24
// new的变量,应该在堆区
cout <<"p : " << (p) << endl; // 0x5602b1012eb0
pthread_t thread;
if(pthread_create(&thread, nullptr, threadFunction, nullptr) != 0) {
std::cerr << "Failed to create thread" << std::endl;
return 1;
}
pthread_join(thread, nullptr);
return 0;
}
有了各个变量的地址,需要查看进程的地址段信息,参考 如何判断一个内存地址属于进程的哪一段? ,在 linux 下用 pmap 进程号
查看。
[ anon ]标记就是 mmap 分配的匿名内存块。what-does-anon-means-in-pmap-linux-cmd