多线程:线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程。
线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文.多线程主要是为了节约 CPU时间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU。
Linux系统下的多线程遵循POSIX线程接口,称为pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。
用到的头文件 pthread.h 库 libpthread.a
创建线程
int pthread_create(pthread_t *tidp, const pthread_attr_t *attr, viod *(* start_rtn) (void), void *arg);
tidp:线程id
attr:线程属性(一般为空)
start_rtn:线程要执行的函数
arg:start_rtn的参数
编译时:gcc filename -lpthread
终止进程
线程的正常退出方式:
(1).线程从启动例程中返回
(2).线程可以被另一个进程终止
(3).线程自己调用pthread_exit函数
void pthread_exit(void *rval_ptr); //终止调用线程
rval_ptr:线程退出返回值的指针
线程等待
int pthread_jion(pthread_t tid,void **rval_ptr);
阻塞调用进程,直到指定的线程终止
tid:等待退出的线程id
rval_ptr:线程退出的返回值的指针
线程标识
pthread_t pthread_self(void);
获取调用线程的自身id
清除
如果发现某段程序线程会中止(包括pthread_exit函数,但不包括return),用pthread_cleanup_push和pthread_cleanup_pop把它包围起来 。
将清除函数压入清除栈
rtn:清除函数
arg:清除函数的参数
void pthread_cleanup_pop(int execute);
将清除函数弹出清除栈
execute执行到pop时是否在弹出清理函数的 同时执行该函数,非0,执行,0则不执行。
例:
#include <pthread.h>
#include <unistd.h>
void *clean(void *arg)
{
printf("cleanup:%s \n",(char *)arg);
return (void *)0;
}
void *thr_fn1(void *arg)
{
printf("thread 1 start\n");
pthread_cleanup_push((void *)clean,"thread 1 first handler");//运用清除函数
pthread_cleanup_push((void *)clean,"thread 1 second handler");
printf("thread 1 push complete\n");
if (arg)
{
return((void *)1);
}
pthread_cleanup_pop(0);
pthread_cleanup_pop(0);
return (void *)1;
}
void *thr_fn2(void *arg)
{
printf("thread 2 start \n");
pthread_cleanup_push((void *)clean,"thread 2 first handler");
pthread_cleanup_push((void *)clean,"thread 2 second handler");
printf("thread 2 push complete\n");
if (arg)
{
return((void *)2);
}
pthread_cleanup_pop(0);
pthread_cleanup_pop(0);
return (void *)2;
}
int main(void)
{
int err;
pthread_t tid1,tid2;
void *tret;
err = pthread_create(&tid1,NULL,thr_fn1,(void *)1);//创建线程1
if (err != 0 )
{
printf("error.....\n");
return -1;
}
err = pthread_create(&tid2,NULL,thr_fn2,(void *)1);//创建线程2
if (err != 0)
{
printf("error.....\n");
return -1;
}
err = pthread_join(tid1,&tret);//线程1等待
if (err != 0)
{
printf("error.....\n");
return -1;
}
printf("pthread 1 exit code %d \n",(int) tret);
}