|
如果线程函数里不用pthread_join()等待子线程结束那会怎么样呢?
看以下代码:
#include <stdio.h>
#include <pthread.h>
struct message {
int i;
int j;
};
void *func_detach (struct message *str)
{
printf ("%d\n", str->i);
sleep (10);
printf ("%d\n", str->j);
}
int main (int argc, char **argv)
{
struct message test;
pthread_t thread_id;
test.i = 10;
test.j = 20;
pthread_create (&thread_id, NULL, (void *)*func_detach, &test);
printf ("不用 pthread_join(),子线程就不能执行完毕,主线程先行结束\n");
return (0);
} 尝试3次运行此程序:./ptread_detach
不用 pthread_join(),子线程就不能执行完毕,主线程先行结束
10
10 ./ptread_detach
不用 pthread_join(),子线程就不能执行完毕,主线程先行结束
10
10 ./ptread_detach
不用 pthread_join(),子线程就不能执行完毕,主线程先行结束
上面是 3 次的执行结果,前面 2 次一样,后面依次连 10 都不输出来了。这说明,如果不用 pthread_join() 函数等待子线程,那么主线程不等子线程执行完就很“粗暴”的结束掉了。那么第1,第 2 次为什么会连续输出两个 10 呢? 原因是系统调用的结果。从这样的结果也大约可以推断出,线程的执行过程是如何的,我不确定是不是这样(第1,第2次的执行情况):
1. 主线程打印出“不用 pthread_join(),子线程就不能执行完毕,主线程先行结束”这个消息。
2. 转到子线程执行,输出 10,然后子线程睡眠。程序又返回到主线程,此时主线程可能已经进入到 return () 函数区域。
3. return (0) 函数还未执行完,再次执行子线程。注意,这里子线程不是从睡眠处开始执行,而是重新执行,所以再次输出 10.
-------------------------------
第 3 次执行情况,子线程根本连执行的机会都没有,主线程直接将自己结束掉。 |
|