曲径通幽论坛

标题: 如果线程函数里不用pthread_join()等待子线程结束? [打印本页]

作者: beyes    时间: 2010-5-25 08:05
标题: 如果线程函数里不用pthread_join()等待子线程结束?
如果线程函数里不用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 次执行情况,子线程根本连执行的机会都没有,主线程直接将自己结束掉。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2