Linux 第三十五章

🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++,linux

🔥座右铭:“不要等到什么都没有了,才下定决心去做”

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

互斥锁

scp指令

线程加锁的本质

可重入VS线程安全(多执行流并发执行同一段代码时造成的数据不一致)

死锁

线程同步

生产者消费者模型

条件变量

pthread_cond_wait

pthread_cond_signal

pthread_cond_broadcast

事例:火车票抢购


互斥锁

创建全局的锁

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//创建全局的锁,用宏去初始化

创建局部的锁

pthread_mutex_t mutex;//创建局部锁的时候不用宏初始化
pthread_mutex_init(&mutex);//初始化
pthread_mutex_destroy(&mutex);//局部的锁,不用时要销毁

scp指令

scp指令是用于在Linux系统中进行文件传输的命令,

其语法如下:

scp [选项] [源文件] [目标文件]
常用选项包括:* -r:递归复制整个目录
* -P:指定端口号
* -p:保持源文件的修改时间、访问时间和权限信息
* -q:安静模式,不显示传输进度信息
示例用法:1. 从本地复制文件到远程服务器:
scp /path/to/local/file username@remotehost:/path/to/remote/directory2. 从远程服务器复制文件到本地:
scp username@remotehost:/path/to/remote/file /path/to/local/directory3. 从远程服务器复制整个目录到本地:
scp -r username@remotehost:/path/to/remote/directory /path/to/local/directory

线程加锁的本质

关于加锁的原则,一般原则:谁加锁,谁解锁

可重入VS线程安全(多执行流并发执行同一段代码时造成的数据不一致)

可重入函数是线程安全函数的一种

线程安全不一定是可重入的,而可重入函数则一定是线程安全的。

如果将对临界资源的访问加上锁,则这个函数是线程安全的,但如果这个重入函数若锁还未释放则会产生死锁,因此是不可重入的。

死锁

原因

1)当两个线程需要都需要两把锁,而它们每一个线程只有一把锁,此时就会导致死锁

2)当一个线程在加锁的时候,没有解锁,又去加锁,这样就会导致死锁

…….

死锁必要条件(产生死锁的时候,这四个条件一定是满足的)

互斥条件:一个资源每次只能被一个执行流使用

请求与保持条件:一个执行流因请求资源而阻塞时,对已获得的资源保持不放

不剥夺条件:一个执行流已获得的资源,在末使用完之前,不能强行剥夺

循环等待条件:若干执行流之间形成一种头尾相接的循环等待资源的关系

避免死锁

破坏死锁的四个必要条件

加锁顺序一致

避免锁未释放的场景

资源一次性分配

线程同步

线程同步的概念:

在临界资源使用安全的前提下,让多线程执行具有一定的顺序性——同步

互斥:能够保证资源的安全性

同步:能够较为充分使用我们的资源

生产者消费者模型

3种关系

生产者之间关系,互斥

消费者之间关系,互斥

生产者与消费者之间关系,互斥和同步

本质:就是用锁和条件变量,维护

2种角色

生产者,消费者——线程或者进程

1个交易场所

内存空间

生产者消费者模型提高了数据处理的能力

条件变量

创建条件变量

pthread_cond_t cond;

全局的条件变量初始化

cond=PTHREAD_COND_INITIALIZER

局部条件变量的初始化

Pthread_cond_init(&cond);

局部条件变量需要销毁

pthread_cond_destory(&cond);

pthread_cond_wait

pthread_cond_wait() 是 POSIX 线程库中的一个函数,用于线程间的条件变量同步。它需要与互斥锁(mutex)和条件变量(condition variable)一起使用。
函数原型如下:

int pthread_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex);pthread_cond_wait() 的作用是让调用线程等待条件变量的满足。在调用该函数之前,
必须先使用 pthread_mutex_lock() 锁住一个互斥锁,以确保线程安全。
当条件变量满足时,pthread_cond_wait() 函数会解锁互斥锁并使线程进入等待状态,
直到被其他线程通过 pthread_cond_signal() 或 pthread_cond_broadcast() 唤醒。

使用示例:

#include <pthread.h>
// 全局互斥锁和条件变量
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
void* thread_func(void* arg) {// 获取互斥锁pthread_mutex_lock(&mutex);// 等待条件变量满足pthread_cond_wait(&cond, &mutex);// 条件变量满足后的处理// 解锁互斥锁pthread_mutex_unlock(&mutex);return NULL;
}
int main() {pthread_t thread;// 创建线程pthread_create(&thread, NULL, thread_func, NULL);// 在某个时刻满足条件,并通知等待的线程pthread_mutex_lock(&mutex);pthread_cond_signal(&cond);pthread_mutex_unlock(&mutex);// 等待线程结束pthread_join(thread, NULL);return 0;
}

在上面的示例中,主线程通过 pthread_cond_signal() 唤醒等待的线程。当满足条件时,等待的线程会被唤醒并继续执行。注意,在调用 pthread_cond_wait() 之前必须加锁(pthread_mutex_lock()),并在条件满足后解锁(pthread_mutex_unlock())。

pthread_cond_signal

pthread_cond_signal() 是 POSIX 线程库中的一个函数,用于唤醒等待在条件变量上的一个线程。它会选择一个等待的线程,并通知该线程条件已经满足,使得该线程从等待状态恢复到运行状态。

函数原型如下:

int pthread_cond_signal(pthread_cond_t* cond);
pthread_cond_signal() 的作用是发送一个信号给等待在条件变量上的某个线程,
使其从等待状态返回。如果有多个线程等待在条件变量上,那么只有其中一个线程会被唤醒,
具体哪个线程被唤醒则不确定。

pthread_cond_broadcast

pthread_cond_broadcast() 是 POSIX 线程库中的一个函数,用于广播唤醒所有等待在条件变量上的线程。当条件满足时,可以使用 pthread_cond_broadcast() 函数来唤醒所有等待在该条件变量上的线程,让它们从等待状态返回到运行状态。
 

函数原型如下:

int pthread_cond_broadcast(pthread_cond_t* cond);
pthread_cond_broadcast() 的作用是向所有等待在条件变量上的线程发送信号,
使它们全部被唤醒。所有被唤醒的线程都会尝试重新获取互斥锁,并继续执行。

1.让线程在进行等待的时候,会自定释放锁

2.线程被唤醒的时候,是在临界区内唤醒的,当线程被唤醒的时候,线pthread_cond_wait返回的时候要重新申请并持有锁

3.当线程被唤醒的时候,重新申请并持有锁的本质是也要参与锁的竞争

单纯的互斥,能保证数据的安全,不一定合理高效!

事例:火车票抢购

test_cond

#include<iostream>
#include<pthread.h>
#include<unistd.h>
using namespace std;pthread_cond_t cond=PTHREAD_COND_INITIALIZER;//条件变量
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;//锁int tickets=1000;void* threadroutine(void* args)
{string name=static_cast<const char*>(args);while(true){// sleep(1);pthread_mutex_lock(&mutex);//加锁if(tickets>0){cout<<name<<", get a ticket: "<<tickets--<<endl;usleep(100);}else{cout<<"没票了"<<name<<endl;pthread_cond_wait(&cond,&mutex);//让线程满足条件变量,才被唤醒//1.让线程在进行等待的时候,会自动释放锁//2.线程被唤醒的时候,是在临界区内唤醒的,当线程被唤醒的时候,线程pthread_cond_wait返回的时候//要重新申请并持有锁//3.当线程被唤醒的时候,重新申请并持有锁的本质是也要参与锁的竞争}pthread_mutex_unlock(&mutex);}
}//主线程
int main()
{pthread_t t1,t2,t3;pthread_create(&t1,nullptr,threadroutine,(void*)"thread - 1");pthread_create(&t2,nullptr,threadroutine,(void*)"thread - 2");pthread_create(&t3,nullptr,threadroutine,(void*)"thread - 3");sleep(5);//主线程5s之后,开始唤醒一个线程while(true){// sleep(1);// pthread_cond_signal(&cond);sleep(20);//休息20s再放一批票pthread_mutex_lock(&mutex);tickets+=1000;pthread_mutex_unlock(&mutex);pthread_cond_signal(&cond);//让一个线程被唤醒,才后这个线程在去抢票}pthread_join(t1,nullptr);pthread_join(t2,nullptr);pthread_join(t3,nullptr);return 0;
}

火车票抢购,其中会同时出现多个人(线程)去抢购票,所有的抢票的过程一定要是原子的,所以需要加互斥锁。还有一个问题,在上面的抢票过程中,会在一段时间增加票的数量,但总不能让某一个人(线程)把这些票都抢光吧!所以就需要条件变量,当这次票完的时候,将这个线程阻塞住,只有被唤醒才可以继续参与抢票。

 🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/706989.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

拥有庞大用户群体的国际顶级安全厂商,究竟在关注什么?

5月6-9日&#xff0c;2024第33届RSA年度会议在旧金山举行&#xff0c;吸引了超过 40000 名来自世界各地的网络安全专业人士。如此盛会&#xff0c;易安联当然不能缺席&#xff0c;我们万里奔赴&#xff0c;亲身领略这场享誉全球的技术盛宴。 ‍‍ ‍ 4天的时间里&#xff0c;…

TikTok Shop本土店回款如何高效查询?用EasyBoss ERP回款记录功能!

大家投入时间和精力去运营Shopee/TikTok本土店&#xff0c;最最最开心的事情就是看赚了多少钱&#xff01;但是&#xff0c;但是&#xff01;很多老板入驻的平台、经营的店铺都不止一个&#xff0c;想要查看不同平台和店铺回款&#xff0c;就需要不断切换不同的店铺后台、下载数…

计算机发展史故事【17】

任天堂崛起 七十年代美国雅达利公司开创一个高科技的电脑游戏业。无独有偶&#xff0c;一家专营电脑游戏机的日本任天堂公司&#xff0c;自八十年代初期把它的家庭电脑游戏机&#xff08;FC&#xff09;投放市场后&#xff0c;不平静的世界被再一次激起轩然大波。这个小小的日本…

录短视频用什么麦克风好?盘点五款热门无线领夹麦克风

如今是一个短视频飞速发展的时代&#xff0c;越来越多自媒体人通过短视频的方式来进行直播带货、生活Vlog、线上K歌等&#xff0c;记录下生活里种种美丽的瞬间。不过一个好的视频除了要有巧妙的构思和清晰稳定的拍摄外&#xff0c;干净的声音也是必不可少的部分。短视频归根结底…

26版SPSS操作教程(高级教程第二十三章)

目录 前言 粉丝及官方意见说明 第二十三章一些学习笔记 第二十三章一些操作方法 时间序列模型 时间序列的建立和平稳化 数据假设 具体操作 定义时间变量 时间序列的平稳化 绘制相应的时间序列图 序列图 自相关图&#xff08;autocorrelation chart&#xff09; 对…

电阻式传感器

电阻式传感器是一种将非电学量&#xff08;如温度、压力、位移等&#xff09;转换为电阻变化的传感器。它大致分为电阻应变式传感器、压阻式传感器和变阻式传感器三类。 电阻式传感器的优点包括结构简单、成本低廉、稳定性好&#xff0c;适用于多种环境。但它们也有局限性&…

Mac SourceTree配置ssh git仓库

一、准备条件 1、Mac系统电脑 2、安装好SourceTree 3、获取ssh git仓库地址 二、配置步骤 1、打开终端命令行 ssh -t rsa -C "xxx""xxx"代表注册git仓库时&#xff0c;使用的用户名&#xff0c;可以是字符串也可以是邮箱地址。 如果遇到输入密码&#xf…

中国开源 AI 大模型之光-InternLM2

今天给大家带来 AI 大模型领域的国产之光 - InternLM2&#xff0c;在10B量级开源大模型领域取得了全球 Top 3 的成绩&#xff0c;仅次于 Meta 发布的 Llama-3&#xff0c;在国内则是第一名的存在&#xff01; 简介 InternLM2是由上海人工智能实验室和商汤科技联合研发的一款大型…

Java语言saas模式云HIS系统源码 前端Angular+后台SpringBoot云HIS系统源码 HIS系统适合哪些类型的医院?

Java语言saas模式云HIS系统源码 前端Angular后台SpringBoot云HIS系统源码 HIS系统适合哪些类型的医院&#xff1f; 云HIS系统&#xff08;医院信息系统&#xff09;是对医院及其所属各部门的人、财、物进行综合管理&#xff0c;对在医疗活动各阶段产生的数据进行采集、储存、处…

iisnginx环境一次奇怪的跨域问题解决经过

跨域问题描述&#xff1a; iis网站跨域、nginx 网站跨域 都已配置&#xff0c;访问接口依然出现跨域问题。 错误提示&#xff1a; ccess to XMLHttpRequest at ‘https://xxx.com/gameapi/preserve/get/status’ from origin ‘https://cdn.xxx.com’ has been blocked by CO…

【苍穹外卖微服务改造】引入minio

目录 1、需求2、步骤分析3、如何实现导入minio依赖编写配置属性类编写配置类编写接口编写实现类配置application.yml 4、其他实现&#xff1a;自定义stater5、总结 1、需求 需求来源&#xff1a; 下面我就给大家总结一下&#xff0c;如何在苍穹外卖的基础上&#xff0c;引入mi…

英语学习笔记14——What color‘s your ... ?

What color’s your … ? 你的 …… 是什么颜色的&#xff1f; 词汇 Vocabulary case n. 箱子【封闭的】 相关&#xff1a;box n. 箱子【开口的】    bookcase n. 书架 补充&#xff1a;case n. 案件&#xff0c;案例 口语&#xff1a;It’s a small case.    小意思&…