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

11.4 Linux_线程_条件变量

概述

条件变量的作用:

条件变量和互斥量配合使用,主要应用于生产者和消费者问题。

这种问题也是一种临界资源的问题,但与互斥量一文中 "写文件" 这种资源不同。文件是一直存在的临界资源,而生产者的资源不是一直存在,资源的产生需要一些条件。条件变量实现了在等待生产者时,消费者进入休眠状态,提高运行效率。

条件变量使用方法:

1、初始化互斥量、条件变量

2.1 生产者:加锁互斥量->生产资源->发送信号给条件变量->解锁互斥量

2.2 消费者:加锁互斥量->无资源时等待条件变量->消费资源->解锁互斥量

相关函数

1、初始化

//动态初始化
int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr);
//静态初始化
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

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

cond:要初始化的条件变量

attr:条件变量属性,NULL代表默认属性

2、销毁 

int pthread_cond_destroy(pthread_cond_t *cond);

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

cond:要销毁的条件变量

3、等待资源

//等待临界资源,阻塞
int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);
//等待临界资源,一段时间后退出阻塞
int pthread_cond_timedwait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex,const struct timespec *restrict abstime);

cond:等待哪一个条件变量的信号

mutex:与条件变量搭配使用的互斥量

注意:该函数在没有资源时,会解锁互斥量,并把本线程休眠。当接收到资源时,会解除休眠,并再次把互斥量上锁

4、发送信号 

//单个发送信号,代表资源来了,所有线程竞争该资源
int pthread_cond_signal(pthread_cond_t *cond);
//广播发送信号,代表资源来了
int pthread_cond_broadcast(pthread_cond_t *cond);

cond:要向哪一个条件变量发送信号

注意:当 "发送信号" 比 "等待资源" 早时,"等待资源" 是接收不到信号的,这会导致信号丢失。这意味着当运行到 "等待资源" 时,会进入阻塞,直到第二次 "发送信号" 到来

生产者消费者示例代码

#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <pthread.h>
#include <stdlib.h>
pthread_mutex_t mutex;//互斥锁
pthread_cond_t cond;//条件变量
//资源
struct resource{char num;struct resource* pNext;
};
struct resource Head;
struct resource* pTail;
//消费者
void* consumer(void* arg){struct resource* pResource = NULL;while(1){//1.加锁互斥量pthread_mutex_lock(&mutex);//2.无资源时等待条件变量,有资源时不断消耗资源while(Head.pNext == NULL){//while的作用:防止信号为广播时产生惊群效应pthread_cond_wait(&cond,&mutex);}//3.消费资源pResource = Head.pNext;Head.pNext = Head.pNext->pNext;if(Head.pNext == NULL){pTail = &Head;}printf("consumer:num = %d\n",pResource->num);free(pResource);//4.解锁互斥量pthread_mutex_unlock(&mutex);sleep(1);}
}
//生产者
void* producer(void* arg){struct resource* pNew = NULL;int i = 0;while(1){//1.加锁互斥量pthread_mutex_lock(&mutex);//2.生产资源if((pNew = malloc(sizeof(struct resource))) == NULL){printf("malloc err\n");pthread_exit(NULL);}pNew->num = i++;pNew->pNext = NULL;pTail->pNext = pNew;pTail = pNew;printf("producer:num = %d\n",pNew->num);//3.发送信号给条件变量pthread_cond_signal(&cond);//4.解锁互斥量pthread_mutex_unlock(&mutex);sleep(1);}
}
int main(){pthread_t tid;Head.pNext = NULL;pTail = &Head;//初始化互斥锁和条件变量pthread_mutex_init(&mutex,NULL);pthread_cond_init(&cond,NULL);//创建线程if(pthread_create(&tid,NULL,producer,NULL) != 0){perror("pthread_create");pthread_detach(tid);return -1;}if(pthread_create(&tid,NULL,consumer,NULL) != 0){perror("pthread_create");return -1;}while(1);//销毁互斥锁和条件变量pthread_mutex_destroy(&mutex);pthread_cond_destroy(&cond);return 0;
}

相关文章:

11.4 Linux_线程_条件变量

概述 条件变量的作用&#xff1a; 条件变量和互斥量配合使用&#xff0c;主要应用于生产者和消费者问题。 这种问题也是一种临界资源的问题&#xff0c;但与互斥量一文中 "写文件" 这种资源不同。文件是一直存在的临界资源&#xff0c;而生产者的资源不是一直存在…...

通信工程学习:什么是IP网际协议

IP&#xff1a;网际协议 IP网际协议&#xff08;Internet Protocol&#xff0c;简称IP&#xff09;是整个TCP/IP协议栈中的核心协议之一&#xff0c;它负责在网络中传送数据包&#xff0c;并提供寻址和路由功能。以下是对IP网际协议的详细解释&#xff1a; 一、对IP网际协议的…...

github 国内文件加速下载

参看;https://www.cnblogs.com/ting1/p/18356265 在源网址前加上 https://hub.gitmirror.com/ 或https://mirror.ghproxy.com/&#xff0c;例如&#xff1a; https://hub.gitmirror.com/https://github.com/t1m0thyj/WinDynamicDesktop/releases/download/v5.4.1/WinDynamicD…...

算法6:模拟运算

文章目录 z字形变幻外观数列数青蛙 题目均来自于力扣 z字形变幻 class Solution { public:string convert(string s, int numRows) {int n s.size();if(n < numRows || numRows 1) return s;int d 2 * numRows - 2;string res;for(int j 0; j < n; j d){res s[j]; …...

【网络协议大花园】应用层 http协议的使用小技巧,用好了都不用加班,效率翻两倍(上篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…...

今日指数day8实战补充(上)

1.用户管理 1.多条件综合查询 1.1 多条件综合查询接口说明 1&#xff09;原型效果 2&#xff09;接口说明 功能描述&#xff1a;多条件综合查询用户分页信息&#xff0c;条件包含&#xff1a;分页信息 用户创建日期范围 服务路径&#xff1a;/api/users 服务方法&#xff1…...

Python 之进阶语法:with...as...

1. Python with…as…是什么 Python 的 with…as… 语句&#xff0c;就像一个贴心的管家&#xff0c;负责照顾你的资源&#xff0c;让你不再担心忘记关闭文件、网络连接或数据库事务等。这个管家在你进入“房间”时自动打开门&#xff0c;离开时帮你把门关上&#xff0c;真的是…...

嵌入式硬件设计知识详解

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

计算机网络:物理层 —— 信道及其极限容量

文章目录 信道信道的极限容量信号失真失真类型产生信号失真的主要因素 奈式准则码元传输速率香农公式 信道 信道是指信息传输的通道或介质。在通信中&#xff0c;信道扮演着传输信息的媒介的角色&#xff0c;将发送方发送的信号传递给接收方。 信道可以是无线信道&#xff0c…...

面向对象特性中 继承详解

目录 概念&#xff1a; 定义&#xff1a; 定义格式 继承关系和访问限定符 基类和派生类对象赋值转换&#xff1a; 继承中的作用域&#xff1a; 派生类的默认成员函数 继承与友元&#xff1a; 继承与静态成员&#xff1a; 复杂的菱形继承及菱形虚拟继承&#xff1a; 虚…...

C++ | Leetcode C++题解之第455题分发饼干

题目&#xff1a; 题解&#xff1a; class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end());sort(s.begin(), s.end());int m g.size(), n s.size();int count 0;for (int i 0, j 0; i < …...

java版基于Spring Boot + Mybatis在线招投标|评标|竞标|单一采购|询价|邀标|在线开标|招标公告发布|评审专家|招投标采购系统源码

一、项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;…...

Anaconda的安装与环境设置

文章目录 一、Anaconda介绍二、Anaconda环境搭建1. 下载Anaconda(1)官网下载(2)清华大学镜像 2. 安装Anaconda3.配置环境变量4.检验conda是否安装成功5.更改镜像源6.若菜单栏没有conda prompt 三、虚拟环境1.创建、查看、删除虚拟环境2.激活、退出虚拟环境 四、CUDA、Pytorch、…...

使用FastAPI做人工智能后端服务器时,接口内的操作不是异步操作的解决方案

在做AI模型推理的接口时&#xff0c;这时候接口是非异步的&#xff0c;但是uvicorn运行FastAPI时就会出现阻塞所有请求。 这时候需要解决这个问题&#xff1a; api.py&#xff1a; import asyncio from fastapi import FastAPI from fastapi.responses import StreamingResp…...

Leetcode 3312. Sorted GCD Pair Queries

Leetcode 3312. Sorted GCD Pair Queries 1. 解题思路2. 代码实现 题目链接&#xff1a;3312. Sorted GCD Pair Queries 1. 解题思路 这一题的话坦率来说没有搞定&#xff0c;后来是找的大佬的代码抄了一下…… 整体来说这道题思路上还是比较暴力的&#xff0c;还是一个二重…...

用 Delphi 做了一个简单的 CMS

Delphi 代码上面花的时间最少。 前提是你要熟悉 Delphi 的 WebBroker 框架。不熟悉也没关系&#xff0c;5分钟就可以入门&#xff0c;10分钟就熟悉了。 CMS 就是个基于 WEB 的内容管理嘛。相当于一个简单的没有跟贴功能的 BBS。这样的东西&#xff0c;后边是数据库&#xff0…...

ASK, PSK, FSK, DPSK

ASK, PSK, FSK, DPSK详解&#xff1a; 这四种调制方式都是数字调制技术&#xff0c;用于将数字信号转换成适合在信道上传输的模拟信号。它们的主要区别在于如何用模拟信号的变化来表示数字信息。 1. ASK (Amplitude Shift Keying) 幅移键控: 原理: ASK 通过改变载波信号的幅…...

【Linux】认识Linux内核中进程级别的文件结构体【files_struct】&文件IO模型初步演示

前言 大家好吖&#xff0c;欢迎来到 YY 滴 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Linux》…...

[Offsec Lab] ICMP Monitorr-RCE+hping3权限提升

信息收集 IP AddressOpening Ports192.168.52.218TCP:22,80 $ nmap -p- 192.168.52.218 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.9p1 Debian 10deb10u2 (protocol 2.0) | ssh-hostkey: | 2048 de:b5:23:89:bb:9f:d4:1…...

Studying-多线程学习Part4 - 异步并发——async future、packaged_task、promise

异步并发——async future packaged_task promise 1.async、future 是C11引入的一个函数模版&#xff0c;用于异步执行一个函数&#xff0c;并返回一个future对象&#xff0c;表示异步操作的结果。使用 async 可以方便地进行异步编程&#xff0c;避免了手动创建线程和管理线程…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...