linux学习笔记15-多线程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;
}
从下图理解多线程栈

秋风
2016-11-27