【发布时间】:2012-08-10 20:12:58
【问题描述】:
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 要求它工作?如果不是,是未定义还是未指定?
【问题讨论】:
标签: c++ pthreads posix language-lawyer