atexit
打电话合法pthread_exit
吗?没有它,main()
返回时所有线程都将终止。(简单的解决方案是修改main()
为调用pthread_exit()
自身,但在这个最小示例派生的实例中这是不可能的)。
#include <unistd.h>
#include <cstdlib>
#include <iostream>
#include <pthread.h>
void *foo(void *data) {
for (int i = 0; i < 10; ++i) {
std::cout << i << "\n";
sleep(1);
}
return NULL;
}
void foo_init() {
std::atexit([](){
pthread_exit(NULL);
});
}
int main() {
foo_init();
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_t thr;
pthread_create(&thr, &attr, foo, NULL);
}
状态的联机帮助页pthread_exit
:
线程终止不会释放任何应用程序可见的进程资源,包括但不限于互斥锁和文件描述符,也不会执行任何进程级别的清理操作,包括但不限于调用任何可能存在的 atexit() 例程。
这似乎排除了疯狂递归破坏事物的风险。
它还指出:
如果从作为对 pthread_exit() 的隐式或显式调用的结果而调用的取消清理处理程序或析构函数调用 pthread_exit() 的行为是未定义的。
这表明在某些地方调用 是未定义的pthread_exit
,但是(除非 main 需要 > 10 秒才能返回,让我们假设在“真实”情况下是不可能的)不适用。
这个例子“对我有用”但是 POSIX 需要它工作吗?如果不是,它是未定义的还是未指定的?