曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 9239|回复: 0
打印 上一主题 下一主题

如果线程函数里不用pthread_join()等待子线程结束?

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2010-5-25 08:05:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如果线程函数里不用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 次执行情况,子线程根本连执行的机会都没有,主线程直接将自己结束掉。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-3 09:25 , Processed in 0.076502 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表