线程基本概念
线程是进程中的一个执行单元,是CPU调度和分配的最小单元,它允许在同一进程中与其他线程并行运行,并可以共享进程内的资源,如内存、地址空间、打开的文件等。线程的切换非常迅速且开销小,因为它在同一进程中的多个线程之间可以并发执行,甚至允许在一个进程中所有线程都能并发执行;不同进程中的线程也能并发执行,充分利用和发挥了处理机与外围设备并行工作的能力。12
线程与进程相对应,线程与资源分配无关,它属于某一个进程,并与进程内的其他线程一起共享进程的资源。每个进程至少有一个线程存在,即主线程。进程是资源分配的基本单位,而线程是系统调度的最小单位。线程具有许多传统进程所具有的特征,因此也被称为轻型进程(Light-Weight Process),相应地,把传统进程称为重型进程(Heavy-Weight Process)。
LWP:light weight process 轻量级的进程。创建线程的底层函数和进程一样,都是clone,因此线程的本质仍是进程(在linux环境下)
与进程相比,线程有独立的TCB结构体(类似于进程的PCB),但没有独立的地址空间(共享),类似于合租与独居。
查看线程号(LWP,不是TID)可以用下述命令:
ps -lf xxx(pid)
线程创建相关函数
//头文件
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
//=================================属性设置按需要采用,若普通情况可以不用设置===============//
// 定义线程的属性变量
pthread_attr_t attr;
// 初始化属性变量
int pthread_attr_init(pthread_attr_t *attr);
// 设置属性变量的值
int pthread_attr_setXXX(pthread_attr_t *attr, ...);
//此处仅列举常用的//
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate); // 设置/获得线程的分离属性
int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);
int pthread_attr_setinheritsched(pthread_attr_t *attr, int inheritsched); // 设置/获得是否继承创建者的调度策略
int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inheritsched);
int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy); // 设置/获得调度策略
int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);
int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param); // 设置/获得线程的静态优先级
int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param);
//=================================上述属性设置按需要采用,若普通情况可以不用设置===============//
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
// 创建线程,此处void *(*start_routine)(void *)函数指针指向的函数,void *arg作为其参数,并且需要采用值传递,如果数据类型不同需要强转
int pthread_detach(pthread_t thread); // 如果没有设置线程的分离属性,可以用此函数强制设为分离属性,防止线程结束后变为僵尸进程,无法释放资源,而且不能再用 pthread_join等待回收该进程的资源
pthread_t pthread_self(void); // 创建成功后,可以在线程中使用,获取当前线程的tid
void pthread_exit(void *retval); // 退出线程,并得到返回值retval
int pthread_cancel(pthread_t thread); // 给指定线程发送一个取消的请求
int pthread_setcancelstate(int state, int *oldstate);
// 设置线程的取消状态:PTHREAD_CANCEL_ENABLE 可取消; PTHREAD_CANCEL_DISABLE 不可取消
int pthread_setcanceltype(int type, int *oldtype);
// 设置线程的取消类型:PTHREAD_CANCEL_DEFERRED 延时响应; PTHREAD_CANCEL_ASYNCHRONOUS 立即响应。
int pthread_join(pthread_t thread, void **retval); // 接合指定已结束或者待结束的线程,并得到返回状态值;如果指定的线程还在运行,将会阻塞等待。
//避免僵尸进程的方法
1:int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate) 提前设置分离属性
2:int pthread_detach(pthread_t thread);子线程创建后强制设置分离属性
3:在线程结束后利用pthread_join()进行接合。
通信方式:
管道通信、 信号通信、共享内存、消息队列、信号量
注意事项
1:在共享进程中申请的内存可以被其他子线程释放
2:在主线程中调用pthread_exit()只会结束主线程,其他子线程不会受到影响,但主线程运用return/exit等语句或子线程调用exit函数都会使整个进程退出
3:线程机制囧两不与信号语义混用。
标签:attr,int,void,接口,线程,pthread,进程,基本概念 From: https://www.cnblogs.com/zeratul/p/18231598