多线程
多线程:线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程。
线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文.多线程主要是为了节约 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把它包围起来 。
vod pthread_cleanup_push (viod(*rtn) (void *),void *arg);
将清除函数压入清除栈
rtn:清除函数
arg:清除函数的参数
void pthread_cleanup_pop(int execute);
将清除函数弹出清除栈
execute执行到pop时是否在弹出清理函数的 同时执行该函数,非0,执行,0则不执行。
例:
#include <stdio.h>
#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);
}