验证线程栈在堆区还是栈区?

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

posted @ 2024-05-21 21:13  hellozhangjz  阅读(11)  评论(0编辑  收藏  举报