免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 7776 | 回复: 36
打印 上一主题 下一主题

[C] sleep和pthread_join的区别 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-02 20:08 |只看该作者 |倒序浏览
为什么主线程必须用pthread_join()才能执行void echomsg(int t),而使用sleep不可以呢?
#include <stdio.h>
#include <pthread.h>
pthread_key_t   key;
void echomsg(int t)
{
        printf("destructor excuted in thread %d,param=%d\n",pthread_self(),t);
}
void * child1(void *arg)
{
        int tid=pthread_self();
        printf("thread %d enter\n",&tid);
        pthread_setspecific(key,&tid);
        printf("thread %d returns %d\n",tid,pthread_getspecific(key));
      
}

int main(void)
{

        int tid1;
        printf("hello\n");

        pthread_key_create(&key,echomsg);
        pthread_create(&tid1,NULL,child1,NULL);
        sleep(10);//不能打印出echomsg(int t)执行的结果
        //pthread_join(tid1,NULL);//能打印出echomsg(int t)执行的结果

        pthread_key_delete(key);
        printf("main thread exit\n");
        return 0;
}

论坛徽章:
0
2 [报告]
发表于 2008-09-02 20:48 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2008-09-02 21:33 |只看该作者
我的确实不行,什么原因啊?

论坛徽章:
0
4 [报告]
发表于 2008-09-02 21:36 |只看该作者
sleep是使当前执行的线程(也就是主线程)睡眠,然后让其他线程执行。
pthread_join让主线程等待某个线程执行完毕再执行,某个线程不结束,主线程会一直等下去的。

[ 本帖最后由 alibabatea 于 2008-9-3 10:06 编辑 ]

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
5 [报告]
发表于 2008-09-02 21:54 |只看该作者
可能跟sleep()有关,sleep()使你的整个进程sleep,而不是只是主线程,在加上主线程运行太快,造成主线程运行完了,也就是整个进程结束了,但子进程还没有结束,所以打印不出来

论坛徽章:
0
6 [报告]
发表于 2008-09-02 23:10 |只看该作者
突然发现我这也可以,可是我在编译LZ的代码的时候改了点东西。否则都编译不过阿。

其实sleep还是可以通过的哈,这个10有10S呢。肯定不短了。

#include <stdio.h>
#include <pthread.h>
pthread_key_t   key;
void * echomsg(int t)   //这里改了下
{
        printf("destructor excuted in thread %d,param=%d\n",pthread_self(),t);
}
void * child1(void *arg)
{
        int tid=pthread_self();
        printf("thread %d enter\n",&tid);
        pthread_setspecific(key,&tid);
        printf("thread %d returns %d\n",tid,pthread_getspecific(key));
      
}

int main(void)
{

        pthread_t tid1;   //还有这里
        printf("hello\n");

        pthread_key_create(&key,(void *)echomsg);   //AND这里
        pthread_create(&tid1,NULL,child1,NULL);
        sleep(10);//不能打印出echomsg(int t)执行的结果

        //pthread_join(tid1,NULL);//能打印出echomsg(int t)执行的结果


        pthread_key_delete(key);
        printf("main thread exit\n");
        return 0;
}

论坛徽章:
0
7 [报告]
发表于 2008-09-03 00:28 |只看该作者
析构函数是在(子)线程结束后由调用pthread_key_create的线程
调用析构函数,这里是主线程,应该要用join等待(子)线程结束后,
主线程调用析构函数。而sleep()如果时间过长,(子)线程结束,
而主线程仍在睡眠,那么等到主线程醒来之后就不会再执行析构函数了

[ 本帖最后由 qliu00 于 2008-9-4 23:29 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2008-09-03 00:30 |只看该作者
原帖由 qliu00 于 2008-9-3 00:28 发表
sleep是使当前执行的线程(也就是主线程)睡眠,应该用usleep唤醒它

等过了10秒后, 它不是会自己动醒过来

论坛徽章:
0
9 [报告]
发表于 2008-09-03 08:12 |只看该作者
原帖由 xi2008wang 于 2008-9-3 00:30 发表

等过了10秒后, 它不是会自己动醒过来


答案是肯定能醒来啊。。。

sleep()就是用来定时的,而pthread_join是要等待到指定的线程结束才可以继续执行的。否则就挂起吧。。。

论坛徽章:
0
10 [报告]
发表于 2008-09-03 08:32 |只看该作者
原帖由 chenzhanyiczy 于 2008-9-2 21:54 发表
可能跟sleep()有关,sleep()使你的整个进程sleep,而不是只是主线程,在加上主线程运行太快,造成主线程运行完了,也就是整个进程结束了,但子进程还没有结束,所以打印不出来

我觉得sleep是针对当前线程的吧,因为sleep(10)期间,创建的线程确实几经执行了,而不是10秒之后才执行的,再说10的时间已经很长了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP