首页 > 解决方案 > 类构造函数中 pthread_t 的生命周期

问题描述

我正在阅读一个项目的源代码,该项目是在 Linux 上使用 C++98 开发的。

有这么一段代码:

class Test {
public:
    Test();
    static void func(void *arg) {
        pthread_detach(pthread_self());
        Test *obj = (Test*)arg;
        // do something
    }
};

Test::Test() {
    pthread_t tid; // ???
    pthread_create(&tid, NULL, Test::func, this);
}

这很清楚:在 的构造函数中创建了一个线程,该线程Test调用了函数func,并且该线程将被分离。

但我很担心pthread_t tid;。当构造函数返回时tid,作为局部变量的变量应该被释放。我对吗?但是,我们已将其地址作为 的第一个参数传递pthread_create

它会导致一些生命周期问题,例如段故障吗?

标签: c++multithreadinglifetime

解决方案


当您调用 pthread_create 时,它​​会将线程的 ID 保存在tid.

它不保存的地址tid。它只是在返回之前将 ID 放在那里。

所以没有问题。


但是,如果这让您感到困扰,您应该调用pthread_detach(tid)Test::Test不是pthread_detach(pthread_self())在线程内调用。

允许线程分离自己,但有点奇怪,因为 的目的是pthread_detach告诉系统没有人会等待这个线程(通过调用pthread_join),所以线程一结束就可以销毁. 通常,创建线程的人决定是否等待它 - 而不是线程本身。


推荐阅读