IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Linux多线程编程API笔记,梳理查阅 -> 正文阅读

[系统运维]Linux多线程编程API笔记,梳理查阅

简述多线程

  • 线程是允许应用程序并发执行多个任务的一种机制

Pthread数据类型

数据类型描述
phtread_t线程ID
pthread_mutex_t互斥对象
pthread_mutexattr_t互斥属性对象
pthread_cond_t条件变量
pthread_condattr_t条件变量的属性对象
pthread_key_t线程特有数据的键
pthread_once_t一次性初始化控制上下文
pthread_attr_t线程的属性对象

Pthreads函数返回值

  • 从系统调用和库函数中返回状态,传统的做法是:返回0表示成功,返回-1表示失败,并设置errno值以标识错误原因,
  • Pthread则:返回0表示成功,返回任意正值表示失败,这一失败的返回值与errno中值的含义相同。

线程相关API

创建线程

#include <pthread.h>
int pthread_create(pthread_t *pthread, const pthread_attr_t *attr, void *(strat)(void*), void *arg);
  • pthread: 保存线程ID
  • attr: 传入线程各个属性设置,NULL则为默认属性
  • 新线程通过调用带有参数arg的函数start而开始执行。

线程终止

线程终止方式:

  • 线程start函数执行return语句并返回指定值
  • 线程调用pthread_exit()
  • 调用pthread_cancel()取消线程
  • 任意线程调用了exit() ,或主程序执行了return,都会导致进程中的所有线程立即终止。

pthread_exit()
将立即终止程序,且返回值可由另一线程通过pthread_join()来获取。

#include <pthread.h>
void ptrhead_exit(void *retval);

retval所指向的内容不应分配与线程栈中,防止失效。

线程ID

进程内部的每一个线程都有一个唯一标识,称为线程ID。
获取线程ID的方法:

  • pthread_create() 返回给调用者
  • pthread_self()函数获得自己的线程ID
    pthread_self()
#include <pthread.h>
pthread_t pthread_self(void);

线程ID的作用:

  • 不同的Pthreads函数利用线程ID来标识要操作的目标线程。(pthread_join\pthread_detach()\pthread_cancel()\pthread_kill())

pthread_equal() 检查两个线程ID是否相同 (ID相同则返回非0,不同则返回0)

#include <pthread.h>
int pthread_equal(pthread_t t1, pthread_t t2);

连接(joining)已终止的线程

函数**ptrhead_join()**等待由pthred_t标识的线程终止。
如果线程已经终止,ptrhead_join()会立即返回。

#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
  • 若retval为非空指针,将会保存线程终止时返回值的拷贝,该返回值亦即线程调用return 或者 pthread_exit()时所指定的值。
  • 向pthread_join传入一个之前已然连接过的线程ID,将会导致无法预知的行为。
  • 若线程并未分离,则必须使用pthread_join()来进行连接。如果未能连接,那么线程终止时将产生僵尸线程。除了浪费系统资源以外,僵尸线程若积累过多,应用将再也无法创建新的线程。

线程的分离

默认情况下,线程是可连接的,线程退出时,可通过pthread_join获得返回状态,但当不关心返回状态时,则可以设置为分离属性,让系统自动清理移除。

#include <pthread>
int pthread_detach(pthread_t thread);

常见用法:pthread_detach(pthread_self());


线程同步

保护对共享变量的访问:互斥量

  • 静态分配的互斥量,初始化静态互斥量PTHREAD_MUTEX_INITIALIZER
#include <pthread.h>

pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
int pthread_mutex_lock(pthread_mutex_t  *mutex);
int pthread_mutex_unlock(pthread_mutex_t  *mutex);
  • 防止互斥量死锁的方案:

    • 定义互斥量的层级关系,总是以相同顺序对改组互斥量进行锁定。
    • 较少使用:尝试一下,然后恢复。 pthread_mutex_trylock(); 如果trylock失败,则将释放该线程所有互斥量。
  • 动态初始化互斥量

#include <pthread.h>
int pthread_mutex-init(pthread_mutex_t *mutex, const pthread_mutexattr_t * attr);

使用场景:

  • 动态分配于堆中的互斥量。例如,动态创建针对某一结构的链表,表中每个结构都包含一个pthread_mutex_t类型字段来存放互斥量,借以保护对该结构的访问。
  • 互斥量是在栈中分配的自动变量
  • 初始化经由静态分配,且不使用默认属性的互斥量。
#include <pthread.h>
int pthread_mutex_destroy(pthread_mutex_t *mutex);

通知状态的改变:条件变量

  • 静态条件变量:pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
  • 条件变量的主要操作是发送信号(signal)和等待(wait)。
  • 发送信号操作通知一个或多个处于等待的线程,某个共享变量的状态已经改变。
  • 等待操作是指在收到一个通知前一直处于阻塞状态。
#include <pthread.h>

int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond);
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
int pthread_cont_timewait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime);

pthread_cond_signal() 和 pthread_cond_broadcast() 差别在于二者对于阻塞pthread_cond_wait()的多个线程处理方式不同。
pthread_cond_signal()只保证唤醒至少一条遭到阻塞的线程
pthread_cond_broadcast() 则会唤醒所有遭到阻塞的线程。

pthread_cont_timewait() 指定等待通知的休眠上线。

  • 动态条件变量
#include <pthread.h>
int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);

int pthread_cond_destroy(pthread_cond_t *cond);

线程取消

  • 取消函数
#include <pthread.h>
int pthread_cancel(pthread_t thread);
  • 取消状态
    PTHREAD_CANCEL_DISABLE,不允许取消,阻塞
    PTHREAD_CANCEL_ENABLE, 允许取消
  • 类型
    PTRHEAD_CANCEL_ASYNCHRONOUS,可能会在任何时间点取消
    PTHREAD_CANCEL_DEFERED,挂起,直到到达取消点
  • 设置函数
#include <pthread.h>

int pthread_setcancelstate(int state, int *oldstate);
int pthread_setcanceltype(int type, int *oldtype);
  • 手动设置取消点
#include <pthread.h>

void pthread_tescancel(void); 
  • 清理函数
#include <pthread.h>

void pthread_cleanup_push(void (*routime)(void*), void *arg);//放线程头
void pthread_cleanup_pop(int execute);//放线程尾

当execute不为0,则表示清理函数一定会执行。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-09-29 10:44:28  更:2021-09-29 10:46:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 17:54:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码