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
),这样线程一结束就可以被销毁。通常,谁创建线程决定是否等待它 - 而不是线程本身。
我正在阅读一个项目的源代码,它是在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
),这样线程一结束就可以被销毁。通常,谁创建线程决定是否等待它 - 而不是线程本身。