Linux 线程

来源:互联网 发布:淘宝开店代理靠谱吗 编辑:程序博客网 时间:2024/05/21 23:31

每个线程都包含有表示执行环境所必须的信息,其中包括进程中标识线程的线程ID、一组寄存器值、栈、调度优先级和策略、信号屏蔽字、errno变量以及线程私有数据。一个进程的所有信息对该进程的所有线程都是共享的,包括可执行程序的代码、程序的全局内存和堆空间、栈以及文件描述符。


1、线程标识


进程ID在整个系统中是唯一的,但线程ID不同,线程ID只有在它所属的进程上下文中才有意义。

<span style="font-family:Microsoft YaHei;font-size:18px;">#include  <pthread.h>int  pthread_equal(pthread_t  tid1, pthread_t  tid2);         //返回值:若相等,返回非0数值; 否则,返回0pthread_t  pthread_self(void); //返回值:调用线程的线程ID</span>
pthread_t类型通常用结构来表示  •不能把它作为整数处理–Linux使用无符号长整数表示  •为了移植,使用函数来比较线程ID

2、线程编程

1、线程创建

#include  <pthread.h>int  pthread_create(pthread_t  *restrict tidp,const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg); //返回值:若成功,返回0; 否则, 返回错误编号。

当pthread_create成功返回时,新创建线程的线程ID会被设置成tidp指向的内存单元。

attr参数用于定制各种不同的线程属性。

新创建的线程从start_rtn函数的地址开始运行,该函数只有一个无类型指针参数。

如果需要向start_rtn函数传递的参数有一个以上,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg参数传入。

#include <stdio.h>#include <pthread.h>void thread(void){        int i;        for(i=0;i<3;i++)        printf("This is a pthread.\n");}int main(void){        pthread_t id;        int i,ret;        ret=pthread_create(&id,NULL,(void *) thread,NULL);        if(ret!=0){                printf ("Create pthread error!\n");                exit (1);        }        for(i=0;i<3;i++)                printf("This is the main process.\n");         pthread_join(id,NULL);         return (0);}


2、线程终止


单个线程可以通过3种方式退出,因此可以再不终止整个进程的情况下,停止它的控制流:

(1)线程可以简单地从启动例程返回,返回值是线程的退出码。

(2)线程可以被同一进程中的其他线程取消。

(3)线程调用pthread_exit。

#include <pthread.h>void  pthread_exit(void  *rval_ptr);
rval_ptr参数是一个无类型指针,与传给启动例程的单个参数类似。进程中的其他线程也可以通过调用pthread_join函数访问这个指针。

#include <pthread.h>int  pthread_join(pthread_t  thread,  void **rval_ptr);
调用线程将一直阻塞,直到指定的线程调用pthread_exit、从启动例程中返回或者取消。如果线程简单地从它的的启动例程返回,rval_ptr就包含返回码。如果线程被取消,有rval_ptr指定的内存单元就设置为PTHREAD_CANCELED。

如果对线程的返回值并不感兴趣,那么可以把rval_ptr设置为NULL。在这种情况下,调用pthread_join函数可以等待指定的线程终止,但并不获取线程的终止状态。


线程可以通过调用pthread_cancel函数来请求取消同一进程中的其他线程。

#include  <pthread.h>int pthread_cancel(pthread_t  tid);//返回值:若成功,返回0;否则,返回错误编号

线程可以选择忽略取消或者控制如何被取消。注意pthread_cancel并不等待线程终止,他仅仅提出请求。

线程可以安排它退出时需要调用的函数,这与进程退出时可以用atexit函数安排退出是类似的。这样的函数称为线程清理处理程序。一个线程可以建立多个清理处理程序。处理程序记录在栈中,也就是说,他们的执行顺序与他们注册时相反。

#include <pthread.h>void  pthread_cleanup_push(void  (*rtn)(void*),  void  *arg);void  pthread_cleanup_pop(int  execute;

当线程执行以下动作时,清理函数rtn是由pthread_cheanup_push函数调度的,调用时只有一个参数arg:

(1) 调用pthread_exit 时;

(2) 响应取消请求时;

(3) 用非零execute参数调用pthread_cleanup_pop时。

0 0