当前位置: 首页 > news >正文

线程的同步与互斥

抢票的例子

竞争过程

进程A被切走

进程B被切走

结论:

互斥

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
  • mutex: 指向要初始化的互斥锁的指针。
  • attr: 用于设置互斥锁属性的指针,通常可以传入 NULL 以使用默认属性。

锁的本质

加锁

解锁

线程安全与重入

死锁

线程同步

生产消费模型

例子

条件变量

demo

#include<iostream>
#include<string>
#include<pthread.h>
#include<unistd.h>int tickets=1000;
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond=PTHREAD_COND_INITIALIZER;void *start_routine(void* args){std::string name=static_cast<const char*>(args);while(true){pthread_mutex_lock(&mutex);pthread_cond_wait(&cond,&mutex);std::cout<<name<<"->"<<tickets<<std::endl;tickets--;pthread_mutex_unlock(&mutex);}return nullptr;
}int main(){const int num=5;pthread_t tid[num]{};for(int i=0;i<num;i++){char *name=new char[64];snprintf(name,sizeof(name),"thread %d",i+1);pthread_create(tid+i,nullptr,start_routine,name);}while(true){std::cout<<"main thread weak up"<<std::endl;pthread_cond_signal(&cond);sleep(1);}for(int i=0;i<num;i++){pthread_join(tid[i],nullptr);}return 0;}

信号量

常用函数

环形队列

环形队列代码

#include"RingQueue.hpp"
#include<unistd.h>
#include<pthread.h>
#include<random>
#include<iostream>void *ProductorRoutine(void* rq){RingQueue<int> *ringqueue=static_cast<RingQueue<int>*>(rq);while(true){int data=rand()%10+1;ringqueue->Push(data);std::cout<<"生产完成 生产的数据是:"<<data<<std::endl;sleep(1);}
}void *ConsumerRoutine(void *rq){RingQueue<int> *ringqueue=static_cast<RingQueue<int>*>(rq);while(true){int data;ringqueue->Pop(data);std::cout<<"消费完成 消费数据是:"<<data<<std::endl;sleep(1);}
}int main(){srand((unsigned int)time(nullptr)^getpid()^pthread_self());RingQueue<int> *rq=new RingQueue<int>();pthread_t p,c;pthread_create(&p,nullptr,ProductorRoutine,rq);pthread_create(&c,nullptr,ConsumerRoutine,rq);pthread_join(p,nullptr);pthread_join(c,nullptr);}
#include<semaphore.h>
#include<vector>
#include<cassert>
#include<ctime>
#include<sys/types.h>static const int gcap=5;template<class T>
class RingQueue{
public:void P(sem_t &sem){int n=sem_wait(&sem);assert(n==0);(void)n;}void V(sem_t &sem){int n=sem_post(&sem);assert(n==0);(void)n;}public:RingQueue(const int &cap=gcap):_q(cap),_cap(cap){int n=sem_init(&_spaceSem,0,_cap);assert(n==0);n=sem_init(&_dataSem,0,0);assert(n==0);productorStep=ConsumerStep=0;}void Push(const T &in){P(_spaceSem);_q[productorStep++]=in;productorStep%=_cap;V(_dataSem);}void Pop(T &out){P(_dataSem);out=_q[ConsumerStep++];ConsumerStep%=_cap;V(_spaceSem);}~RingQueue(){sem_destroy(&_spaceSem);sem_destroy(&_dataSem);}private:std::vector<T> _q;int _cap;sem_t _spaceSem;  //生产者 空间资源sem_t _dataSem;   //消费者 数据资源int productorStep;int ConsumerStep;
};

相关文章:

线程的同步与互斥

抢票的例子 竞争过程 进程A被切走 进程B被切走 结论&#xff1a; 互斥 int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); mutex: 指向要初始化的互斥锁的指针。attr: 用于设置互斥锁属性的指针&#xff0c;通常可以传入 NULL 以使用默认属性…...

低代码实施复杂应用的实践方法

内容来自演讲&#xff1a;韦有炬 | 柳州知行远企业管理咨询有限公司 | 总经理 摘要 本文探讨了在全民开发时代如何使用低代码实施复杂应用并降低上线风险。文章分析了复杂系统实施失败的风险&#xff0c;包括项目规划不周、人员变动、企业基础管理不足等&#xff0c;并对比了低…...

算法学习系列(十一):KMP算法

目录 引言一、算法概念二、题目描述三、思路讲解三、代码实现四、测试 引言 这个KMP算法就是怎么说呢&#xff0c;就是不管算法竞赛还是找工作笔试面试&#xff0c;都是非常爱问爱考的&#xff0c;其实也是因为这个算法比较难懂&#xff0c;其实就是很难&#xff0c;所以非常个…...

****Linux下Mysql的安装和配置

1、安装mysql 1.1、安装mysql sudo aptitude search mysql sudo apt-get install mysql-server mysql-client1.2、启动停止mysql: service mysql stop service mysql restart mysql -u debian-sys-maint -p mysql命令详细解释如下: 一、 启动方式 1、使用 service 启动…...

第十六节TypeScript 类

1、简介 TypeScript是面向对象的JavaScript。 类描述了所创建的对象共同的属性与方法。 2、类的定义 class class_name { // 类作用域 } 定义类的关键字是class&#xff0c;后面紧跟类名&#xff0c;类可以包含以下几个模块&#xff1a; 字段 – 字段是类里面声明的变量。字…...

RocketMQ的Docker镜像部署(以及Dashboard的部署、ACL配置)

RocketMQ的Docker镜像部署&#xff08;以及Dashboard、ACL&#xff09; 准备 包含RocketMQ部署&#xff08;NameServer、Broker&#xff09;、Dashboard、ACL拉取镜像 RocketMQ$ docker pull apache/rocketmq:5.1.4Dashboard$ docker pull apacherocketmq/rocketmq-dashboard…...

数据仓库【2】:架构

数据仓库【2】&#xff1a;架构 1、架构图2、ETL流程2.1、ETL -- Extract-Transform-Load2.1.1、数据抽取&#xff08;Extraction&#xff09;2.1.2、数据转换&#xff08;Transformation&#xff09;2.1.3、数据加载&#xff08; Loading &#xff09; 2.2、ETL工具2.2.1、结构…...

JavaScript函数表达式

JavaScript函数表达式是一种将函数赋值给变量的方式。函数表达式可以以匿名形式或具名形式存在。 匿名函数表达式&#xff1a; var func function() {// 函数的逻辑 }在上面的例子中&#xff0c;将一个匿名函数赋值给变量func。 具名函数表达式&#xff1a; var func fun…...

LabVIEW在齿轮箱故障诊断中的应用

LabVIEW在齿轮箱故障诊断中的应用 在现代机械工业中&#xff0c;齿轮箱作为重要的传动设备&#xff0c;其性能稳定性对整体机械系统的运行至关重要。故障的及时诊断和处理不仅保障了设备的稳定运行&#xff0c;还减少了维护成本。利用LabVIEW强大数据处理和仿真能力&#xff0…...

图片转excel:“保留数字格式”在什么场景下该勾

保留数字格式是什么意思呢&#xff1f;顾名思义&#xff0c;就是将转出来的数字保留为数字格式&#xff0c;而不是文本格式。我们知道&#xff0c;OCR程序将图片上的文字识别为电脑可编辑的文字后&#xff0c;如果导入到excel不加处理&#xff0c;则单个数字过长的文字就会被ex…...

SpringMVC:整合 SSM 下篇

文章目录 SpringMVC - 05整合 SSM 下篇一、设计页面1. 首页&#xff1a;index.jsp2. 展示书页面&#xff1a;showBooks.jsp3. 增加书页面&#xff1a;addBook.jsp4. 修改书页面&#xff1a;updateBook.jsp5. 总结 二、控制层1. 查询全部书2. 增加书3. 修改书4. 删除书5. 搜索书…...

[2023-年度总结]凡是过往,皆为序章

原创/朱季谦 2023年12月初&#xff0c;傍晚&#xff0c;在深圳的小南山看了一场落日。 那晚我们坐在山顶的草地上&#xff0c;拍下了这张照片——仿佛在秋天的枝头上&#xff0c;结出一颗红透的夕阳。 这一天很快就会随着夜幕的降临&#xff0c;化作记忆的碎片&#xff0c;然…...

OpenCV之像素操作

我们首先了解一下什么是像素&#xff0c;计算机中是如何存储图像&#xff0c;以及opencv是如何表示图像的。 像素&#xff1a; 像素是指由图像的小方格即所谓的像素(pixel)组成的&#xff0c;这些小方块都有一个明确的位置和被分配的色彩数值&#xff0c;而这些一小方格的颜色…...

Transfer Learning(迁移学习)

1. 什么是迁移学习 迁移学习(Transfer Learning)是一种机器学习方法&#xff0c;就是把为任务 A 开发的模型作为初始点&#xff0c;重新使用在为任务 B 开发模型的过程中。迁移学习是通过从已学习的相关任务中转移知识来改进学习的新任务&#xff0c;虽然大多数机器学习算法都…...

NPM 的使用技巧:简化 JavaScript 开发和依赖管理

前言 NPM&#xff08;Node Package Manager&#xff09;是 JavaScript 生态系统中最流行的包管理工具之一。本文将介绍一些有用的 NPM 使用技巧&#xff0c;帮助开发者更好地利用 NPM 管理项目依赖、执行脚本、发布自己的包以及解决常见问题。 1. 初始化项目 使用 NPM 初始化…...

统计和绘图软件GraphPad Prism mac功能特点

GraphPad Prism mac是一款专业的统计和绘图软件&#xff0c;主要用于生物医学研究、实验设计和数据分析。 GraphPad Prism mac功能和特点 数据导入和整理&#xff1a;GraphPad Prism 可以导入各种数据格式&#xff0c;并提供直观的界面用于整理、编辑和管理数据。用户可以轻松…...

WWW 指南-万维网联盟(World Wide Web)

WWW - 万维网联盟 WWW通常称为网络。 web是一个世界各地的计算机网络。 电脑在Web上使用标准语言沟通。 万维网联盟&#xff08;W3C&#xff09;制定了Web标准 什么是WWW&#xff1f; WWW 代表 World Wide Web(万维网)万维网常常被称为 网络网络是世界各地的计算机网络网络中…...

Linux网络编程之TCP/IP实现高并发网络服务器设计指南

目录 引言&#xff1a; 多进程服务器 例程分享&#xff1a; 多线程服务器 例程分享&#xff1a; I/O多路复用服务器 select 例程分享&#xff1a; poll 例程分享&#xff1a; epoll 例程分享&#xff1a; 总结建议 引言&#xff1a; 随着互联网的迅猛发展&#xff…...

【SpringBoot实战】基于阿里云实现文件上传

【SpringBoot实战】基于阿里云实现文件上传 在实际项目开发中&#xff0c;不可避免地会使用到阿里云OSS进行文件存储。尽管阿里云有详细的开发文档&#xff0c;但本篇博客的目的是让我们能够用简明的代码快速实现这个功能。 引入依赖 <dependencies><!-- 阿里云oss…...

大数据技术学习笔记(十一)—— Flume

目录 1 Flume 概述1.1 Flume 定义1.2 Flume 基础架构 2 Flume 安装3 Flume 入门案例3.1 监控端口数据3.2 实时监控单个追加文件3.3 实时监控目录下多个新文件3.4 实时监控目录下的多个追加文件 4 Flume 进阶4.1 Flume 事务4.2 Flume Agent 内部原理4.3 Flume 拓扑结构4.3.1 简单…...

Trigger.dev与Supabase集成:构建全栈实时任务系统的终极指南

Trigger.dev与Supabase集成&#xff1a;构建全栈实时任务系统的终极指南 【免费下载链接】trigger.dev Trigger.dev – build and deploy fully‑managed AI agents and workflows 项目地址: https://gitcode.com/gh_mirrors/tr/trigger.dev Trigger.dev是一个强大的工作…...

从零到一:基于ESP8266 AT指令与华为云IoT平台构建智能设备原型

1. ESP8266硬件准备与固件烧录 第一次接触ESP8266时&#xff0c;我被这个小巧的Wi-Fi模块惊艳到了——它只有指甲盖大小&#xff0c;却能实现完整的网络连接功能。不过在实际使用中&#xff0c;我发现出厂固件往往功能不全&#xff0c;特别是MQTT支持不够完善&#xff0c;这时候…...

Python崛起背后的四大引擎:从数据科学到Web开发的全栈语言进化

1. 从数据看趋势&#xff1a;Python为何成为开发者社区的“流量明星”最近在Stack Overflow上看到一组数据&#xff0c;挺有意思的。数据科学家David Robinson指出&#xff0c;Python已经成为该平台上访问量增长最快的主流编程语言。这个结论不是空穴来风&#xff0c;而是基于对…...

硬件产品出海必读:从Type A到Type O,不同国家电源插头标准与适配设计要点

硬件产品出海必读&#xff1a;全球电源插头标准与适配设计实战指南 当你的智能音箱在德国用户家中无法充电&#xff0c;或是电饭煲在英国市场因插头不兼容遭遇退货&#xff0c;电源适配问题就从技术细节升级为商业风险。全球电源插头的差异远不止物理形状的区别&#xff0c;背后…...

为Claude Code配置Taotoken解决API密钥不稳定与Token不足问题

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为Claude Code配置Taotoken解决API密钥不稳定与Token不足问题 应用场景类&#xff0c;许多开发者使用Claude Code作为编程助手但常…...

SketchUp 2021照片匹配实战:手把手教你用一张床头柜照片快速建模(含尺寸校准技巧)

SketchUp 2021照片匹配实战&#xff1a;从单张照片到精准3D模型的完整工作流 在室内设计和家具建模领域&#xff0c;时间就是金钱。当你手头只有一张产品照片——可能是电商平台的商品图&#xff0c;或是客户发来的参考图片——如何快速将其转化为可编辑的3D模型&#xff1f;Sk…...

Freewall跨浏览器兼容性:解决IE8+布局问题的完整方案

Freewall跨浏览器兼容性&#xff1a;解决IE8布局问题的完整方案 【免费下载链接】freewall kombai/freewall: Freewall 是一个灵活、响应式的网格布局引擎&#xff0c;可用于创建具有自适应布局功能的网页或应用组件&#xff0c;尤其适合于图片墙、瀑布流布局等场景。 项目地…...

告别网络限制:用BilibiliDown轻松下载B站视频与音频

告别网络限制&#xff1a;用BilibiliDown轻松下载B站视频与音频 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors/bi/…...

自建个人知识管理系统Memex:从数据捕获到知识图谱的实践

1. 项目概述&#xff1a;一个私人数字记忆库的诞生几年前&#xff0c;我开始意识到一个严重的问题&#xff1a;我的数字生活正在变得支离破碎。一篇在浏览器里偶然看到的深度文章&#xff0c;一个在社交媒体上转瞬即逝的灵感火花&#xff0c;一段在播客里听到的精彩论述&#x…...

Quectel移远展锐平台5G模组RX500U/RG200U工作模式深度解析:从网卡到路由的实战选择

1. 5G模组工作模式基础认知 第一次接触Quectel移远展锐平台5G模组时&#xff0c;最让我困惑的就是网卡模式和路由模式的区别。记得去年做智能快递柜项目时&#xff0c;就因为没搞清这两种模式的特点&#xff0c;导致现场调试时手忙脚乱。后来在工业网关项目上反复折腾RX500U模组…...