您的位置:首页 > 运维架构 > Linux

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;

}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: