linux学习笔记15-多线程2

信号一般不在子线程中使用

线程退出3种方式

  1. 线程执行的函数执行完毕,返回值是线程的退出码.
  2. 线程可以被同一进程的其他线程取消.
  3. 线程执行函数中调用pthread_exit函数.

1 线程执行完毕,返回线程退出码

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>


#include <pthread.h>

void *func(void *arg)
{
	printf("thread print content!\n");
	return NULL;                //执行完毕,返回NULL的退出码
}

int main(int argc,char *argv[])
{
	pthread_t pthreadid;
	int result = pthread_create(&pthreadid,NULL,func,NULL);
	if(result != 0)
	{
		printf("create thread faliled: %s!\n",strerror(errno));
	}
	pthread_join(pthreadid,NULL);  //主线程挂起,等待子线程执行完毕,唤醒主线程
	return 0;
}

2 线程被进程中其他线程取消

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <pthread.h>

void *func(void *arg)
{
	int index = 0;
	while(1)
	{
	  printf("print %d\n",++index);
	  sleep(1);
	}
	return NULL;
}

int main(int argc,char *argv[])
{
	pthread_t threadid;
	if(pthread_create(&threadid,NULL,func,NULL) != 0)
	{
		printf("create thread falied:%s!\n",strerror(errno));
	}
	else
	{
		sleep(10);
		pthread_cancel(threadid);  //在主线程通过线程id调用pthread_cancel取消该线程执行
	}
	return 0;
}


3 pthread_exit退出

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

#include <pthread.h>

void *func(void *arg)
{
	printf("thread print content!\n");
	pthread_exit((void *)1);         //让当前线程退出,并设置退出码为1
}

int main(int argc,char *argv[])
{
	pthread_t pthreadid;
	int result = pthread_create(&pthreadid,NULL,func,NULL);
	void *thread_result;    //存放线程退出码
	if(result != 0)
	{
		printf("create thread faliled: %s!\n",strerror(errno));
	}
	result =  pthread_join(pthreadid,&thread_result);  //主线程挂起,等待子线程执行完毕,唤醒主线程
	if(result != 0)
	{
		printf("join thread failed:%s!\n",strerror(errno));
	}
	else
	{
		printf("thread exit code %d\n",(int)thread_result); //获取线程退出码
	}
	return 0;
}


多个线程并行处理

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>

#include <pthread.h>

void *func(void *arg)
{
	int *param = (int *)arg;
	printf("thread%d print begin!\n",*param);
        int i=0;                                 //这个变量不受多线程并行执行影响
	for(;i<5;i++)
	{
		printf("thread%d print %d\n",*param,i);
		sleep(1);
	}
	printf("thread%d print end!\n",*param);
	return NULL;   //正常返回
}

int main(int argc,char *argv[])
{
	pthread_t pthreadida,pthreadidb;
	int a = 1;
	int b = 2;
	printf("a=%p,b=%p\n",&a,&b);
	int resulta = pthread_create(&pthreadida,NULL,func,&a);
	if(resulta != 0)
	{
		printf("create threada faliled:%s!\n",strerror(errno));
	}
	int resultb = pthread_create(&pthreadidb,NULL,func,&b);
	if(resultb != 0)
	{
		printf("create threadb failed:%s!\n",strerror(errno));
	}
	
	pthread_join(pthreadida,NULL);
	pthread_join(pthreadidb,NULL);
	return 0;
}


从下图理解多线程栈

    上图主要是从内存4区,来画的,可以看这篇认识c语言的内存四区

秋风 2016-11-27