Linux--线程

2024-11-14  本文已影响0人  锈色的栅栏

1【线程的概述】

进程 是系统分配资源的基本单位
线程 是cpu执行调度的基本单位

线程是轻量级的进程(LWP:light weight process),在Linux环境下线程的本质仍是进程,进程必须至少包含一个线程。
线程 依赖于 进程,线程共享进程的资源,进程结束 当前进程的所有线程 都将立即结束。

线程共享资源

1) 文件描述符表
2) 每种信号的处理方式
3) 当前工作目录
4) 用户ID和组ID 内存地址空间 (.text/.data/.bss/heap/共享库)

线程非共享资源

1) 线程id
2) 处理器现场和栈指针(内核栈)
3) 独立的栈空间(用户空间栈)
4) errno变量
5) 信号屏蔽字
6) 调度优先级

线程的优缺点

优点: Ø 提高程序并发性 Ø 开销小 Ø 数据通信、共享数据方便
缺点: Ø 库函数,不稳定 Ø 调试、编写困难、gdb不支持 Ø 对信号支持不好 优点相对突出,缺点均不是硬伤。Linux下由于实现方法导致进程、线程差别不是很大。

2【线程的API】

1、查看线程号 

#include<pthread.h>
pthread_t pthread_self(void);

功能:
        获取线程号。
参数:
        无
返回值:
        调用线程的线程 ID

2、创建线程

#include<pthread.h>
int pthread_create(pthread_t*thread,const pthread_attr_t *attr, void *(*start_routine)(void *),
void *arg );

功能:
        创建一个线程
参数:
        thread:线程标识符地址。
        attr:线程属性结构体地址,通常设置为 NULL。
        start_routine:线程函数的入口地址。
        arg:传给线程函数的参数。
返回值:
        成功:0
        失败:非 0

3、回收线程资源(阻塞)

#include<pthread.h>
int pthread_join(pthread_t thread, void **retval);

功能:
        等待线程结束(此函数会阻塞),并回收线程资源,类似进程的 wait() 函数。如果线程已经结束,
        那么 该函数会立即返回。

参数:
        thread:被等待的线程号。
        retval:用来存储线程退出状态的指针的地址
返回值:
        成功:0
        失败:非 0

4、pthread_detach分离线程(不阻塞)

#include<pthread.h>
int pthread_detach(pthread_t thread);

功能:
        使调用线程与当前进程分离,分离后不代表此线程不依赖与当前进程,线程分离的目的是将线
        程资源的回收工作交由系统自动来完成,也就是说当被分离的线程结束之后,系统会自动回收
        它的资源。所以,此函数不会阻塞。
参数:
        thread:线程号。
返回值:
        成功:0
        失败:非0

5、pthread_exit线程退出

#include<pthread.h>
void pthread_exit(void *retval);

功能:
        退出调用线程。一个进程中的多个线程是共享该进程的数据段,因此,通常线程退出后所占用
        的资源并不会释放。
参数:
        retval:存储线程退出状态的指针。
返回值:无

6、pthread_cancel线程的取消

#include<pthread.h>
int pthread_cancel(pthread_t thread);

功能:
        杀死(取消)线程
参数:
        thread : 目标线程ID。
返回值:
        成功:0
        失败:出错编号

知识点5【线程的属性】

typedef struct

      int etachstate; //线程的分离状态 
      int schedpolicy; //线程调度策略 
      struct sched_param schedparam; //线程的调度参数 
      int inheritsched; //线程的继承性 
      int scope; //线程的作用域 
      size_t guardsize; //线程栈末尾的警戒缓冲区大小 
      int stackaddr_set; //线程的栈设置 
     void* stackaddr; //线程栈的位置 
     size_t stacksize; //线程栈的大小 
 }pthread_attr_t;


初始化线程属性函数:
int pthread_attr_init(pthread_attr_t *attr);
    函数返回值:成功:0;失败:错误号

销毁线程属性所占用的资源函数:
    int pthread_attr_destroy(pthread_attr_t*attr);
    函数返回值:成功:0;失败:错误号

线程分离状态的函数:

设置线程属性,分离or非分离
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);

获取程属性,分离or非分离
int pthread_attr_getdetachstate(pthread_attr_t *attr, int* detachstat);
参数:
        attr:已初始化的线程属性
        detachstate:分离状态 
                PTHREAD_CREATE_DETACHED(分离线程)
                PTHREAD_CREATE_JOINABLE(非分离线程)

上一篇 下一篇

猜你喜欢

热点阅读