Linux线程

Linux线程

Linux中线程使用第三方线程库:NPTL(POSIX标准)

编译时加入:-lpthread

gcc -o app thread.c -lpthread

 

相关命令

ps -elf # 查看所有线程
ps -lf pid # 查看指定进程中的线程

 

函数

线程创建

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); // 创建线程

1. 线程id  2. 线程属性  3. 线程工作  4. 线程工作参数

 

线程属性设置:

typedef struct
{
    int                           detachstate;     线程的分离状态
    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); // 初始化线程属性
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate); // 设置线程回收态/分离态
PTHREAD_CREATE_DETACHED : 分离态
PTHREAD_CREATE_JOINABLE : 回收态
int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate); // 获取线程状态:detachstate
int pthread_attr_destroy(pthread_attr_t *attr);
pthread_attr_setstack(); // 设置栈地址/栈大小, 可以通过malloc申请空间
pthread_attr_getstack(); // 获取

 

 

线程回收

int pthread_join(pthread_t thread, void **retval); // 回收指定线程资源, 传出退出值, 阻塞

任何线程都可以执行回收任务。

 

获取线程id

pthread_t pthread_self(void); // 获取自身tid

 

线程分离

分离态线程:内核自动回收, 不需要我们手动回收, 我们无法得到线程退出码

int pthread_detach(pthread_t thread); // 设置指定线程为分离态

线程初始状态为回收态, 将回收态线程设置为分离态后将无法设置为回收态。

可以在创建线程时将线程初始状态设置为分离态

分离态线程无法被回收

回收阶段的线程无法被设置为分离态

 

线程退出

exit(0); // 整个进程终止
return 0; // 主控线程调用进程终止, 普通线程调用仅结束线程
pthread_exit(0); // 仅结束线程, 与进程无关
int pthread_cancel(pthread_t thread); // 结束指定线程, 与进程无关, 退出码为-1

 

线程函数错误处理方式, 返回错误号

char *strerror(int errnum); // 通过错误号查看错误信息

 

主控线程:可以进行线程的创建工作(main函数的工作)

普通线程:主控线程创建出的线程, 不可以创建新的线程

进程中能够创建的最大线程数量:进程资源 / 线程栈大小

 

线程安全

 

posted @ 2020-08-25 15:48  x_Aaron  阅读(140)  评论(0)    收藏  举报