Linux 操作系统&线程2

关于线程的基础函数功能和用法请看:

Linux 操作系统&线程1-CSDN博客

目录

1、线程间通信

2、线程的同步和互斥

2.1、互斥锁

[2.1.1 定义/初始化一个互斥锁](#2.1.1 定义/初始化一个互斥锁)

[2.2.1 加锁](#2.2.1 加锁)

[2.2.2 解锁](#2.2.2 解锁)

[2.2.3 销毁锁](#2.2.3 销毁锁)

[3 条件变量](#3 条件变量)

[3.1 创建并且初始化一个条件变量](#3.1 创建并且初始化一个条件变量)

[3.1.1 动态创建](#3.1.1 动态创建)

[3.2 没有满足条件阻塞](#3.2 没有满足条件阻塞)

[3.3 满足条件解除阻塞](#3.3 满足条件解除阻塞)

[3.4 销毁](#3.4 销毁)

4、信号量

[4.1 信号量初始化](#4.1 信号量初始化)

[4.2 获取信号量的值](#4.2 获取信号量的值)

[4.3 消耗](#4.3 消耗)

[4.4 释放](#4.4 释放)

[4.5 清理](#4.5 清理)


1、线程间通信

线程间进行通信使用全局变量即可。

信号(同进程)

函数原型:

cs 复制代码
int pthread_kill(pthread_t thread, int sig);

参数:

thread:线程ID

sig:发送的信号

返回值:成功返回0;

2、线程的同步和互斥

2.1、互斥锁

每一次操作资源的时候,默认去检测锁,如果锁处于加锁状态会等待锁解开,如果锁处于解锁状态,加锁使用,使用完毕后,解锁。

使用流程:

1、定义/初始化一个互斥锁:

cs 复制代码
pthread_mutex_t mutex;//定义
pthread_mutex_init();//初始化

2、竞争占用互斥锁:

cs 复制代码
pthread_mutex_lock 上锁

3、释放互斥锁资源:

cs 复制代码
 pthread_mutex_unlock //解锁

4、销毁互斥锁:

cs 复制代码
 pthread_mutex_destroy

2.1.1 定义/初始化一个互斥锁

1-> 动态创建:

cs 复制代码
pthread_mutex_t mutex;

初始化函数原型:

cs 复制代码
int pthread_mutex_init(
    pthread_mutex_t *mutex,
    pthread_mutexattr_t *attr)

参数:1描述锁的变量 pthread_mutex_t mutex;

2指定锁的类型,默认NULL表示创建快速互斥锁

返回值:

成功:0 失败: -1

举例使用:

cs 复制代码
pthread_mutex_t mutex;
pthread_mutex_init(&mutex,NULL);

2-> 静态创建

cs 复制代码
pthread_mutex_t lock=PTHREAD_MUTEX_INITIALIZER;//静态创建快速互斥锁

2.2.1 加锁

函数原型:

cs 复制代码
int pthread_mutex_lock(pthread_mutex_t *mutex);-- 阻塞

参数:mutex 互斥锁

返回值:成功:0,失败:返回错误号

cs 复制代码
int pthread_mutex_trylock(pthread_mutex_t *mutex);

非阻塞版本,如果mutex参数所指定的互斥锁已经被锁定的话,调用pthread_mutex_trylock 函数不会阻塞当前线程, 而是立即返回一个值来描述互斥锁的状况。

2.2.2 解锁

函数原型:

cs 复制代码
int pthread_mutex_unlock(pthread_mutex_t *mutex);

参数:mutex 互斥锁

返回值:成功:0;失败:返回错误号

2.2.3 销毁锁

cs 复制代码
int pthread_mutex_destroy(pthread_mutex_t *mutex);

参数:mutex 互斥锁

注意事项:

在同一个线程中,第一次上锁(lock),没有问题,然后没有解锁(unlock),再一次上锁,会发生阻塞,且会一直阻塞下午。

3 条件变量

条件变量:当一个条件没有满足会阻塞程序,满足条件后可以解除阻塞

3.1 创建并且初始化一个条件变量

3.1.1 动态创建

函数原型:

cs 复制代码
int pthread_cond_init(
    pthread_cond_t *restrict_cond,
    const pthread_condattr_t *restrict_attr);

参数:

restrict_cond: 定义一个变量 pthread_cond_t cond

第二个一般为 NULL

静态创建

cs 复制代码
pthread_cond_t cond=PTHREAD_COND_INITIALIZER;//静态创建

3.2 没有满足条件阻塞

函数原型:

cs 复制代码
int pthread_cond_wait(pthread_cond_t *restrict_cond,
    pthread_mutex_t *restrict_mutex);

参数:

restrict_cond: 定义一个变量 pthread_cond_t cond

restrict_mutex: 定义并且初始化好的互斥锁变量

pthread_mutex_t mutex

3.3 满足条件解除阻塞

函数原型:

cs 复制代码
int pthread_cond_signal(pthread_cond_t *cond)

形参:code -- 条件变量

3.4 销毁

函数原型:

cs 复制代码
int pthread_cond_destroy(pthread_cond_t *cond);

4、信号量

信号量:本质上是一个非负的整数计数器,用来控制对公共资源的访问

原理:p 操作使 sem 减一,v 操作使 sem 加一。信号量sem的值大于零时,线程具有公共资源的访问权限。

头文件:

cs 复制代码
#include <semaphore.h>

4.1 信号量初始化

函数原型:

cs 复制代码
int sem_init(sem_t *sem, int pshared, unsigned int value);

参数:

sem: 初始化信号量

pshared: 指定为 0

value: 信号量初值

返回值: 成功: 0, 失败 : -1

4.2 获取信号量的值

函数原型:

cs 复制代码
int sem_getvalue(sem_t *sem, int *sval);

4.3 消耗

函数原型:

cs 复制代码
int sem_wait(sem_t *sem);

参数:

阻塞 -- p 操作

参数: 信号量的标识符

返回值

成功:0 失败 :-1

非阻塞:

cs 复制代码
int sem_trywait(sem_t *sem);--非阻塞

4.4 释放

函数原型:

cs 复制代码
int sem_post(sem_t *sem); -- v 操作

参数:信号量的标识符

返回值:成功:0 失败 :-1

4.5 清理

函数原型:

cs 复制代码
sem_destroy(sem_t *sem);
相关推荐
执风挽^10 分钟前
Python基础编程题2
开发语言·python·算法·visual studio code
酉鬼女又兒17 分钟前
每天一个Linux命令_printf
linux·运维·服务器
Z9fish20 分钟前
sse哈工大C语言编程练习20
c语言·开发语言·算法
Trouvaille ~23 分钟前
TCP Socket编程实战(三):线程池优化与TCP编程最佳实践
linux·运维·服务器·网络·c++·网络协议·tcp/ip
June`32 分钟前
高并发网络框架:Reactor模式深度解析
linux·服务器·c++
萧鼎44 分钟前
Python 包管理的“超音速”革命:全面上手 uv 工具链
开发语言·python·uv
Anastasiozzzz1 小时前
Java Lambda 揭秘:从匿名内部类到底层原理的深度解析
java·开发语言
刘琦沛在进步1 小时前
【C / C++】引用和函数重载的介绍
c语言·开发语言·c++
机器视觉的发动机1 小时前
AI算力中心的能耗挑战与未来破局之路
开发语言·人工智能·自动化·视觉检测·机器视觉
HyperAI超神经2 小时前
在线教程|DeepSeek-OCR 2公式/表格解析同步改善,以低视觉token成本实现近4%的性能跃迁
开发语言·人工智能·深度学习·神经网络·机器学习·ocr·创业创新