Linux : 线程(thread)
2016-05-19 23:14
435 查看
线程:
优点:节俭,可以共享堆栈段,数据段。同一个进程下的线程可以共享数据空间。
Linux下的多线程遵循的是POSIX线程接口,称为pthread
(头文件pthread.h),连接使用的库是lib pthread.a .
一.创建线程
int
pthread_create(pthread_t *tidp, const pthread_attr_t *attr, void
*(*start_rtn)(void), void *arg)
(1).
tidp: 线程id (获取线程的id).
(2). attr: 线程属性 (一般为空NULL).
(3). start_rtn: 线程要执行的函数.
(4). arg: start_rtn函数的参数.
(5). 返回值: 0 代表成否,其它为错误.
编译时要加上 -lpthread
例子: gcc file.c -lpthread -o
file
二.线程终止
线程从启动到进程中返回.(return)
线程可以被另一个进程终止.
线程自己调用终止函数.(pthread_exit)
void
pthread_exit(void *rval_ptr)
功能:终止调用的线程.
rval_ptr: 线程退出返回值的指针.
三.线程的等待
(堵塞)
int
pthread_join(pthread_t pid, void
**rval_ptr)
功能:阻塞调用线程的进程,直到指定的线程终止.
tid:
等待退出的线程id. (pthread_create获取)
rval_ptr: 线程退出的返回值指针.
四.线程标识
pthread_t
pthread_self(void)
功能:获取线程标识符.
五.线程清除
从pthread_cleanup_push的调用点到pthrad_cleanup_pop之间的程序段中的终止动作(包括调用pthread_exit和异常终止,但是不包括return)都将执行.
void pthread_cleanup_push(void
(*rtn)(void *), void *arg)
功能:清除函数压入清除栈中.
rtn:
清除函数.
arg:
清除函数的参数.
void
pthread_cleanup_pop(int execute)
功能:
清除函数出栈.
execute: 非0执行 0不执行 (异常出现都会执行
不管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 hadler");
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)
{
pthread_exit((void *)2);
}
pthread_cleanup_pop(0);
pthread_cleanup_pop(0);
pthread_exit((void *)2);
}
int main(void)
{
int
err;
pthread_t
tid1,tid2;
void
*tret;
err = pthread_create(&tid1,NULL,thr_fn1,(void
*)1);
if(err !=
0)
{
printf("error .... \n");
return -1;
}
err =
pthread_create(&tid2,NULL,thr_fn2,(void
*)1);
if(err != 0)
{
printf("error .... \n");
return -1;
}
err =
pthread_join(tid1,&tret);
if(err !=
0)
{
printf("error .... \n");
return -1;
}
printf("thread 1 exit code %d
\n",(int)tret);
err = pthread_join(tid2,&tret);
if(err !=
0)
{
printf("error .... ");
return -1;
}
printf("thread 2 exit code %d
\n",(int)tret);
return
1;
}
优点:节俭,可以共享堆栈段,数据段。同一个进程下的线程可以共享数据空间。
Linux下的多线程遵循的是POSIX线程接口,称为pthread
(头文件pthread.h),连接使用的库是lib pthread.a .
一.创建线程
int
pthread_create(pthread_t *tidp, const pthread_attr_t *attr, void
*(*start_rtn)(void), void *arg)
(1).
tidp: 线程id (获取线程的id).
(2). attr: 线程属性 (一般为空NULL).
(3). start_rtn: 线程要执行的函数.
(4). arg: start_rtn函数的参数.
(5). 返回值: 0 代表成否,其它为错误.
编译时要加上 -lpthread
例子: gcc file.c -lpthread -o
file
二.线程终止
线程从启动到进程中返回.(return)
线程可以被另一个进程终止.
线程自己调用终止函数.(pthread_exit)
void
pthread_exit(void *rval_ptr)
功能:终止调用的线程.
rval_ptr: 线程退出返回值的指针.
三.线程的等待
(堵塞)
int
pthread_join(pthread_t pid, void
**rval_ptr)
功能:阻塞调用线程的进程,直到指定的线程终止.
tid:
等待退出的线程id. (pthread_create获取)
rval_ptr: 线程退出的返回值指针.
四.线程标识
pthread_t
pthread_self(void)
功能:获取线程标识符.
五.线程清除
从pthread_cleanup_push的调用点到pthrad_cleanup_pop之间的程序段中的终止动作(包括调用pthread_exit和异常终止,但是不包括return)都将执行.
void pthread_cleanup_push(void
(*rtn)(void *), void *arg)
功能:清除函数压入清除栈中.
rtn:
清除函数.
arg:
清除函数的参数.
void
pthread_cleanup_pop(int execute)
功能:
清除函数出栈.
execute: 非0执行 0不执行 (异常出现都会执行
不管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 hadler");
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)
{
pthread_exit((void *)2);
}
pthread_cleanup_pop(0);
pthread_cleanup_pop(0);
pthread_exit((void *)2);
}
int main(void)
{
int
err;
pthread_t
tid1,tid2;
void
*tret;
err = pthread_create(&tid1,NULL,thr_fn1,(void
*)1);
if(err !=
0)
{
printf("error .... \n");
return -1;
}
err =
pthread_create(&tid2,NULL,thr_fn2,(void
*)1);
if(err != 0)
{
printf("error .... \n");
return -1;
}
err =
pthread_join(tid1,&tret);
if(err !=
0)
{
printf("error .... \n");
return -1;
}
printf("thread 1 exit code %d
\n",(int)tret);
err = pthread_join(tid2,&tret);
if(err !=
0)
{
printf("error .... ");
return -1;
}
printf("thread 2 exit code %d
\n",(int)tret);
return
1;
}
相关文章推荐
- Linux: 进程间通信
- Linux:内核进程 (脑里面必有…
- Linux:proc文件系统
- Linux:Qt的编译和安装配置 (本…
- Linux学习进阶路线
- linux常用命令-查看linux是多少位的
- Linux下find函数用法汇总
- 编写linux服务启动脚本
- linux 读取U盘的VID和PID
- Linux 常用的命令,更新中
- Linux驱动模型(六)
- Linux系统小知识汇总
- Linux命令——文件查找命令find
- archlinux设置屏幕亮度
- Linux下实现Qt 4.6.3移植 Ubuntu10.10篇--转载
- linux-----强大的find
- Linux——学习篇(二)之find命令
- find命令浅析
- Linux 下的指令
- Linux服务器安全策略