系统编程之线程
在C语言 NOTE6有写过一些,为加深印象再做详细的记录
如何创建并使用线程?
1.创建线程
功能 创建一条新线程
- 头文件
#include <pthread.h> - 函数原型
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
参数 | Value |
---|---|
thread | 新线程的 TID |
attr | 线程属性 |
start_routine | 线程例程 |
arg | 线程例程的参数 |
- 返回值
成功 0
失败 errno
2.结束线程
结束当前线程,并且向创建它的上一级线程或等待它的线程发送遗言
- 头文件
*#include <pthread.h> - 函数原型
void pthread_exit(void *retval);
- 参数 retval 线程退出值
3. 等待线程 如果它有遗言则接受
功能 接合指定线程
- 头文件
#include <pthread.h> - 函数原型
int pthread_join(pthread_t thread, void **retval);
参数 | Value |
---|---|
thread | 等待线程的 TID |
retval | 线程退出时的 遗言 |
- 返回值
成功 0
失败 errno
4.取消线程
线程可以让指定的正在运行的且没有设置 阻塞取消信号 属性的线程取消,但是不可以取消自己
功能 给指定线程发送一个取消请求
- 头文件
#include <pthread.h> - 函数原型
int pthread_cancel(pthread_t thread);
- 参数 thread 线程 TID
- 返回值
成功 0
失败 errno
注意 需要线程有断点的时候才能正常取消,正常情况下,线程都会响应取消信号。但如果是连续赋值或连续占用CPU的函数,该线程在接收到取消信号以后,会暂时阻塞,直到下一个断点函数执行时,响应取消信号
使用 man 7 pthreads 查看相应的会正常响应取消信号的函数找到该章节即有如下:
5.获取自己的线程号
- 头文件
#include <pthread.h> - 函数原型
pthread_t pthread_self(void);
6.手动设置线程属性为不能被取消
功能 获取、设置线程的取消状态和取消类型
- 头文件
#include <pthread.h>
- 函数原型
int pthread_setcancelstate(int state, int *oldstate);
int pthread_setcanceltype(int type, int *oldtype);
参数 | Value |
---|---|
state | 新的取消状态 |
PTHREAD_CANCEL_ENABLE | 使能取消请求 |
PTHREAD_CANCEL_DISABLE | 关闭取消请求 |
oldstate | 旧的取消状态,一般设置为NULL |
type | 新的取消类型 |
PTHREAD_CANCEL_DEFERRED | 延时响应 |
PTHREAD_CANCEL_ASYNCHRONOUS | 立即响应 |
oldtype | 旧的取消类型 一般设置为NULL |
- 返回值
成功 0
失败 errno
备注:
1.缺省的取消状态是 PTHREAD_CANCEL_ENABLE
2.缺省的取消类型是 PTHREAD_CANCEL_DEFERRED
注意:
pthread_setcancelstate只是暂时阻塞取消信号,并不是屏蔽,当解除不可取消时,线程会在下一个断点的位置被取消掉。
7.线程属性
分离属性:为了让子线程与创建它的线程无关,在结束后自动销毁所有资源,不会产生僵尸线程,此时pthread_join不可以等待分离线程。
功能 获取、设置线程的分离属性
在线程创建前设置分离属性
- 头文件
#include <pthread.h> - 函数原型
int pthread_attr_setdetachstate(pthread_attr_t *attr,int detachstate);
int pthread_attr_getdetachstate(pthread_attr_t *attr,int *detachstate);
参数 | Value |
---|---|
attr | 线程属性变量的地址 |
detachstate | |
PTHREAD_CREATE_DETACHED | 分离 |
PTHREAD_CREATE_JOINABLE | 接合 |
- 返回值
成功 0
失败 errno
备注 线程缺省的状态是接合的
需要初始化线程属性,创建线程成功后销毁
初始化线程属性 | int pthread_attr_init(pthread_attr_t *attr); |
---|---|
销毁线程属性 | int pthread_attr_destroy(pthread_attr_t *attr); |
在线程创建后设置分离属性
- 头文件
#include <pthread.h> - 函数原型
int pthread_detach(pthread_t thread); --->线程号
此时需要注意,pthread_join 的运行要在pthread_detach之后,否则会正常等待线程结束。