b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

join()函数的区分、线程与这两个函数的联系

电脑杂谈  发布时间:2020-01-24 09:02:12  来源:网络整理

mybatis返回null值_js递归函数返回多个值_pthreadjoin返回值

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
void create_pthread(void);
void pthread1(void);
void pthread2(void);
pthread_t thread;
pthread_t thread1;
void create_pthread(void)
{
	
	printf("create pthread1:\n");
	pthread_create(&thread,NULL,(void *)&pthread1,NULL);
	pthread_detach(thread);
	
	pthread_create(&thread1,NULL,(void *)&pthread2,NULL);
	pthread_detach(thread1);
	
}
void pthread2(void)
{
	char buf[10];
	while(1)
	{
		fgets(buf,sizeof(buf),stdin);
		fputs(buf,stdout);
		printf("-----starting  pthread2-------\n");
	}
	return;
}
void pthread1(void)
{
	
	while(1)
	{
	printf("-----starting  pthread1-------\n");
	sleep(1);
	}	
	return;
}
int main(void)
{
	
	
	printf("-----starting main pthread-------\n");
	create_pthread();
	sleep(5);
	printf("end main pthread\n");
	
	return 0;
	
}

执行结果:main函数结束,pthread1也跟着结束

线程结束,pthread1也跟着结束。因为这时程序进程尚未结束,所有的线程将要会被回收掉。

有两种方式可以让pthread1在主线程结束的之后再次执行,执行中途使用pthread_exit()函数退出主线程,或者是使主线程一直存在不结束。

mybatis返回null值_pthreadjoin返回值_js递归函数返回多个值

方法一:pthread_exit()

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
void create_pthread(void);
void pthread1(void);
void pthread2(void);
pthread_t thread;
pthread_t thread1;
void create_pthread(void)
{
	
	printf("create pthread1:\n");
	pthread_create(&thread,NULL,(void *)&pthread1,NULL);
	pthread_detach(thread);
	
	pthread_create(&thread1,NULL,(void *)&pthread2,NULL);
	pthread_detach(thread1);
	
}
void pthread2(void)
{
	char buf[10];
	while(1)
	{
		fgets(buf,sizeof(buf),stdin);
		fputs(buf,stdout);
		printf("-----starting  pthread2-------\n");
	}
	return;
}
void pthread1(void)
{
	
	while(1)
	{
	printf("-----starting  pthread1-------\n");
	sleep(1);
	}	
	return;
}
int main(void)
{
	
	
	printf("-----starting main pthread-------\n");
	create_pthread();
	sleep(5);
	printf("end main pthread\n");
	pthread_exit("end"); 	//退出main pthread这个线程,但是进程并没退出,所以接着执行后面的线程
	return 0;
	
}

执行结果:主线程退出,pthread1继续执行

方法二:使用while(1)让main不会退出

js递归函数返回多个值_pthreadjoin返回值_mybatis返回null值

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
void create_pthread(void);
void pthread1(void);
void pthread2(void);
pthread_t thread;
pthread_t thread1;
void create_pthread(void)
{
	printf("create pthread1:\n");
	pthread_create(&thread,NULL,(void *)&pthread1,NULL);
	pthread_detach(thread);
	
	pthread_create(&thread1,NULL,(void *)&pthread2,NULL);
	pthread_detach(thread1);
	
}
void pthread2(void)
{
	char buf[10];
	while(1)
	{
		fgets(buf,sizeof(buf),stdin);
		fputs(buf,stdout);
		printf("-----starting  pthread2-------\n");
	}
	return;
}
void pthread1(void)
{
	
	while(1)
	{
	printf("-----starting  pthread1-------\n");
	sleep(1);
	}	
	return;
}
int main(void)
{
	
	printf("-----starting main pthread-------\n");
	create_pthread();
	sleep(5);
	printf("end main pthread\n");
	while(1)
	{
		sleep(1);
	}
	return 0;
	
}

执行结果:两个都在执行

上面都是使用pthread_detach()来使pthread1分离状况,我们也可以使用pthread_join()来使线程变为等待回收状态:

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
void create_pthread(void);
void pthread1(void);
void pthread2(void);
pthread_t thread;
pthread_t thread1;
void create_pthread(void)
{
	
	printf("create pthread1:\n");
	pthread_create(&thread,NULL,(void *)&pthread1,NULL);
	//pthread_detach(thread);
	pthread_join(thread,NULL);
	
	pthread_create(&thread1,NULL,(void *)&pthread2,NULL);
	pthread_detach(thread1);
	
}
void pthread2(void)
{
	char buf[10];
	
	while(1)
	{
		fgets(buf,sizeof(buf),stdin);
		fputs(buf,stdout);
		printf("-----starting  pthread2-------\n");
	}
	return;
}
void pthread1(void)
{
	int i=0;
	//while(1)
	for(i=0;i<5;i++)
	{
	printf("-----starting  pthread1-------\n");
	sleep(1);
	}	
	return;
}
int main(void)
{
	
	
	printf("-----starting main pthread-------\n");
	create_pthread();
	sleep(5);
	printf("end main pthread\n");
	
	return 0;
	
}

pthreadjoin返回值_mybatis返回null值_js递归函数返回多个值

执行结果:main不会立即退出,它会期待pthread1执行完才一起被回收结束

到此处,如果还不明白,看下边这个实例,你就知道pthread_detach(),pthread_join()的区别了:

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
void create_pthread(void);
void pthread1(void);
void pthread2(void);
pthread_t thread;
pthread_t thread1;
void create_pthread(void)
{
	
	printf("create pthread1:\n");
	pthread_create(&thread,NULL,(void *)&pthread1,NULL);
	pthread_detach(thread);
	
	pthread_create(&thread1,NULL,(void *)&pthread2,NULL);
	pthread_detach(thread1);
	
}
void pthread2(void)
{
	char buf[10];
	while(1)
	{
		fgets(buf,sizeof(buf),stdin);
		fputs(buf,stdout);
		printf("-----starting  pthread2-------\n");
	}
	return;
}
void pthread1(void)
{
	
	while(1)
	{
	printf("-----starting  pthread1-------\n");
	sleep(1);
	}	
	return;
}
int main(void)
{
	
	
	printf("-----starting main pthread-------\n");
	create_pthread();
	//sleep(5);
	printf("end main pthread\n");
	/*
	while(1)
	{
		sleep(1);
	}
	*/
	return 0;
	
}

执行结果:

js递归函数返回多个值_pthreadjoin返回值_mybatis返回null值

这里虽然pthread1与main线程是分离的,但是main结束的简直是很快了,它还没来得及去执行pthread1整个进程就结束了。所以的线程都被回收掉。

总结:

pthread_detach():使线程分离子线程,他不依赖主线程(即与主线程无关),它单独占有资源。在主线程退出时,它还可以单独存在,运行。(前提是进程没有结束),这里注意,一旦进程结束退出pthreadjoin返回值,所有的线程资源就会被释放掉,线程也就全部中止,离开没有进程来说线程是无意义的。

pthread_join():子线程依赖于主线程pthreadjoin返回值,主线程先结束时不会立即中止,它会期待子线程结束时,才中止程序。

pthread_exit():可以终止正在运行的一个线程。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-138014-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...