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函数的工作)
普通线程:主控线程创建出的线程, 不可以创建新的线程
进程中能够创建的最大线程数量:进程资源 / 线程栈大小
线程安全

浙公网安备 33010602011771号