c++ - 类构造函数中 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
。
它会导致一些生命周期问题,例如段故障吗?
解决方案
当您调用 pthread_create 时,它会将线程的 ID 保存在tid
.
它不保存的地址tid
。它只是在返回之前将 ID 放在那里。
所以没有问题。
但是,如果这让您感到困扰,您应该调用pthread_detach(tid)
而Test::Test
不是pthread_detach(pthread_self())
在线程内调用。
允许线程分离自己,但有点奇怪,因为 的目的是pthread_detach
告诉系统没有人会等待这个线程(通过调用pthread_join
),所以线程一结束就可以销毁. 通常,创建线程的人决定是否等待它 - 而不是线程本身。
推荐阅读
- c++ - 使用 PsLookupProcessByProcessId 获取进程 PID
- java - Mongo upsert 性能问题
- angular - 如何在角度变量中设置jquery数据?
- apache-camel - Camel 3 中的 Camel 代理支持
- datepicker - katalon 记录器在运行时无法读取日期选择器
- javascript - 在导出函数中调用方法或 useState setState
- android - 如何检测图像是垂直还是水平
- linux - 使用 epoll 监听只读 sysfs 文件
- javascript - 如何用数组替换 javascript url?
- opentracing - 如何在正在运行的应用程序中启用和禁用跟踪