pthread_t 在 class 的构造函数中的生命周期

lifetime of pthread_t in constructor of class

我正在阅读一个项目的源代码,它是在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;。当构造函数returns时,变量tid作为局部变量,应该被释放。我对吗?但是,我们已经将它的地址作为pthread_create的第一个参数传递了。

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

当你调用pthread_create时,它会在tid中保存线程的ID。

不保存tid的地址。它只是将 ID 放在它前面 returns.

所以没有问题。


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

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