主题 : 请教一个关于线程的问题 复制链接 | 浏览器收藏 | 打印
爱我所爱,做我所做。
级别: 新手上路
UID: 40950
精华: 0
发帖: 22
金钱: 110 两
威望: 22 点
综合积分: 44 分
注册时间: 2011-03-24
最后登录: 2013-03-05
楼主  发表于: 2011-05-17 12:16

 请教一个关于线程的问题

看囯嵌的视频中,进程中用pthread_create建立一个线程以后,线程是就绪态,并没立即执行,而是继续执行进程中的代码,除非加pthread_join,才先执行线程,线程退出后才继续执行进程。
但我现在遇到的问题是:建立好线程后,它就直接执行线程中的内容了,也就是加与不加pthread_join都是优先执行线程,请问如何解决呢》?

如下面代码:
代码:
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>
void thread(void)
{
int i;
for(i=0;i<10;i++){
sleep(1);
printf("this is %d pthread\n",i);
}
}
int main(void)
{
pthread_t id;
int i,ret;
ret = pthread_create(&id,NULL,(void*)thread,NULL);
if(ret!=0){
printf("creat error");
exit(1);
}
for(i=0;i<10;i++)
{
sleep(1);
printf("this is the main thread\n");
//pthread_join(id,NULL);
return 0;
}
}

执行效果
this is 0 pthread
this is the main thread

分析:
按老师的说法,屏蔽掉pthread_join(id,NULL);
的话,应该执行不到线程,直接返回退出了,但执行效果不是。
主程序进程执行到
sleep(1);printf("this is the main thread\n");
的sleep(1)这句时,并没执行printf("this is the main thread\n");
而是去执行线程了,执行完线程中的输出,在线程sleep时才又回到进程中,并return,结束,所以有上面的结果,不像老师说的那样,主进程创建线程时先继续运行进程。求解答?谢谢!!
做我想做之事,爱我所爱之人!
爱我所爱,做我所做。
级别: 新手上路
UID: 40950
精华: 0
发帖: 22
金钱: 110 两
威望: 22 点
综合积分: 44 分
注册时间: 2011-03-24
最后登录: 2013-03-05
1楼  发表于: 2011-05-17 14:15
期待传说中的高手出手相助啊!
做我想做之事,爱我所爱之人!
级别: 新手上路
UID: 45719
精华: 0
发帖: 11
金钱: 60 两
威望: 12 点
综合积分: 22 分
注册时间: 2011-05-07
最后登录: 2017-09-13
2楼  发表于: 2011-05-17 18:06
pthread_join(id,NULL);//是等待线程结束的函数,假如没有它,主线程
                     return 0;整个程序就结束。
你的代码中的return 0;是放在main中的for()循环里面,
所以当执行完一句,printf()语句之后,return 0;程序自然就结束。

当然线程的执行顺序是不确定的,比如,你的代码在我电脑上的运行结果就是一句:
this is the main thread而没有执行子线程的代码。

当你把return 0;放到for()循环外面的时候
for(i=0; i<10; i++) 就执行9次打印。就是9次sleep(),9次让出CPU给子线程,
然后碰到 return 0;结束。
爱我所爱,做我所做。
级别: 新手上路
UID: 40950
精华: 0
发帖: 22
金钱: 110 两
威望: 22 点
综合积分: 44 分
注册时间: 2011-03-24
最后登录: 2013-03-05
3楼  发表于: 2011-05-18 11:06

 回 2楼(sampl) 的帖子

是的,return放错地方了。 我想问的是,如何来控制线程建立好后不会执行,而是继续执行主线程中内容,直到主线程中遇到sleep或者join函数才去执行子线程? 怎么样能达到这种效果?
做我想做之事,爱我所爱之人!