免费注册 查看新帖 |

Chinaunix

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

一个关于linux线程的问题(pthread_join) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-01 21:37 |只看该作者 |倒序浏览
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

void task1(int *counter);
void task2(int *counter);
void cleanup(int counter1, int counter2);

int g1 = 0;
int g2 = 0;

int main(int argc, char *argv[])
{
pthread_t thrd1, thrd2;
int ret;

/* Create the first thread */
ret = pthread_create(&thrd1, NULL, (void *)task1, (void *)&g1);
if(ret) {
perror("pthread_create: task1");
exit(EXIT_FAILURE);
}
/* Create the second thread */
ret = pthread_create(&thrd2, NULL, (void *)task2, (void *)&g2);
if(ret) {
perror("pthread_create: task2");
exit(EXIT_FAILURE);
}

pthread_join(thrd2, NULL);
pthread_join(thrd1, NULL);

cleanup(g1, g2);
printf("%x,%x\n",EXIT_FAILURE,EXIT_SUCCESS);
exit(EXIT_SUCCESS);
}

void task1(int *counter)
{
while(*counter < 5) {
printf("task1 count: %d\n", *counter);
(*counter)++;
sleep(1);
}
}

void task2(int *counter)
{
while(*counter < 5) {
printf("task2 count: %d\n", *counter);
(*counter)++;
}
}

void cleanup(int counter1, int counter2)
{
printf("total iterations: %d\n", counter1 + counter2);
}


出来的结果是:
task1 count: 0
task2 count: 0
task2 count: 1
task2 count: 2
task2 count: 3
task2 count: 4
task1 count: 1
task1 count: 2
task1 count: 3
task1 count: 4
total iterations: 10
书上的说明是thrd1被thrd2用对自己的pthread_join调用所中断,直到thrd2执行完毕。不明白啊,望高手解答!

论坛徽章:
0
2 [报告]
发表于 2009-03-02 09:02 |只看该作者
就是它一直在那等着,直到thread2执行完毕

论坛徽章:
0
3 [报告]
发表于 2009-03-02 09:55 |只看该作者
我也不明白,为什么要写:
pthread_join(thrd2, NULL);
pthread_join(thrd1, NULL);

只写一个是什么结果?

论坛徽章:
0
4 [报告]
发表于 2009-03-02 10:06 |只看该作者
主线程等待两个子线程终止啊

论坛徽章:
0
5 [报告]
发表于 2009-03-02 10:09 |只看该作者
原帖由 alucard_yk 于 2009-3-1 21:37 发表
#include  
#include  
#include  
#include  

void task1(int *counter);
void task2(int *counter);
void cleanup(int counter1, int counter2);

int g1 = 0;
int g2 = 0;

int main(int  ...

刚没仔细看题,什么书上说“thrd1被thrd2用对自己的pthread_join调用所中断,直到thrd2执行完毕”?
莫名其妙。。。。胡扯
LZ你自己看一下pthread_join的用法不就完了么

论坛徽章:
0
6 [报告]
发表于 2009-03-02 15:25 |只看该作者
我要是能看懂就不会发帖子问啦,看书上的函数说明很容易,关键是这个例子我不明白为什么会出这样的结果啊,在task1第一次sleep(1)的时候貌似他会被task2阻塞直至task2结束,不明白各个线程的执行次序啊。另外,如果把pthread_join(thrd1, NULL); 这句去掉的话出来的结果就是 :
task1 count: 0
task2 count: 0
task2 count: 1
task2 count: 2
task2 count: 3
task2 count: 4
total iterations: 6   
而如果去掉pthread_join(thrd2, NULL);
这句的话结果跟原来没什么变化。

论坛徽章:
0
7 [报告]
发表于 2009-03-02 15:48 |只看该作者
哥哥,你看见两个task有啥区别没啊?
一个有sleep,一个没,这下你明白了不?

论坛徽章:
0
8 [报告]
发表于 2009-03-02 15:56 |只看该作者
明白了,之所以会出这样的结果,是因为task1sleep的时候task2的任务全部完成了,其实它们之间不存在互相阻塞的关系,但是书上说的是task1被task2用pthread_join调用中断了,被它误导了,郁闷啊!《GNU/Linux编程指南》232页,有这本书的可以去查下是不是书上说错了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP