看了這篇文章 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