C语言 NOTE35

系统编程之线程

在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之后,否则会正常等待线程结束。

发布了52 篇原创文章 · 获赞 2 · 访问量 1991

猜你喜欢

转载自blog.csdn.net/weixin_42191545/article/details/104207950