Linux的条件变量
条件变量
条件变量本身不是锁,但是它可以造成线程阻塞。通常于互斥锁配合使用。给多线程提供一个会和的场合。
- 使用互斥量保护共享数据
- 使用条件变量可以造成线程阻塞,等待某个条件的发生,当条件满足的时候解除阻塞。
条件变量的两个动作:
- 条件不满足,阻塞线程
- 条件满足,通知阻塞的线程解除阻塞
相关函数:
pthread_cond_t cond 定义一个cond条件变量
int pthread_cond_init(pthread_cond_t *restrict cond,
const pthread_condattr_t *restrict attr);
函数描述:初始化条件变量;
cond 条件变量 attr 条件变量属性,设NULL
函数返回值:成功返回0,失败返回错误号
int pthread_cond_destroy(pthread_cond_t *cond);
函数描述:销毁一个条件变量
int pthread_cond_wait(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex);
函数描述:条件不满足,引起线程阻塞并解锁
条件满足,解除条件阻塞,并加锁
函数参数:cond->条件变量 mutex->互斥锁
int pthread_cond_signal(pthread_cond_t *cond);
函数描述:唤醒至少一个阻塞在该条件变量(cond)上的线程
函数参数:条件变量
函数返回值:成功返回0,失败返回错误号
生产者与消费者模型:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
#include<pthread.h>
//定义一个链表
typedef struct node
{int data;struct node* next;
}node;
//定义一个头节点
node *phead;
//定义一个互斥锁变量
pthread_mutex_t mutex;
//定义一个条件变量
pthread_cond_t cond;
void *producer(void *arg)
{srand(time(NULL));while(1){
//生成一个新的节点node *pNode=NULL;pNode=(node*)malloc(sizeof(node));if(pNode==NULL){printf("malloc error");exit(-1);}
//加锁pthread_mutex_lock(&mutex);pNode->data=rand()%100;//随机生成数printf("p:[%d]\n",pNode->data);
//头插法:pNode->next=phead;phead=pNode;
//解锁pthread_mutex_unlock(&mutex);
//唤醒至少一个线程pthread_cond_signal(&cond);sleep(1);//防止生成过快,导致内存不足}
}
void *consumer(void *arg)
{while(1){pthread_mutex_lock(&mutex);//加锁if(phead==NULL){
//如果头节点为空,那么阻塞并解锁
//如果头节点不为空,接收到pthread_cond_signal的唤醒,解除阻塞并加锁pthread_cond_wait(&cond,&mutex);}node*pNode=phead;printf("c:[%d]\n",pNode->data);
//头节点移动phead=phead->next;
//释放当前节点free(pNode);pNode=NULL;
//解锁pthread_mutex_unlock(&mutex);sleep(2);}
}
int main()
{pthread_mutex_init(&mutex,NULL);//初始化互斥锁pthread_cond_init(&cond,NULL);//初始化条件变量pthread_t thread1;pthread_t thread2;int ret=pthread_create(&thread1,NULL,producer,NULL);if(ret!=0){printf("pthread_create1 error:[%s]\n",strerror(ret));return -1;}ret=pthread_create(&thread2,NULL,consumer,NULL);if(ret!=0){printf("pthread_create2 error:[%s]\n",strerror(ret));return -1;}
//阻塞等待线程结束pthread_join(thread1,NULL);pthread_join(thread2,NULL);
//销毁pthread_mutex_destroy(&mutex);pthread_cond_destroy(&cond);return 0;
}
多线程core掉的情况:
假如只有一个生产者生产了一个节点,此时会调用pthread_cond_signal通知消费者线程,此时若有多个消费者被唤醒了,则最终只有一个消费者获得锁,然后进行消费,此时会将head置为NULL,然后其他被唤醒的消费者线程会有一个获得锁,然后读取的head的内容会core掉。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
#include<pthread.h>
typedef struct node
{int data;struct node* next;
}node;
node *phead;
pthread_mutex_t mutex;
pthread_cond_t cond;
void *producer(void *arg)
{srand(time(NULL));while(1){node *pNode=NULL;pNode=(node*)malloc(sizeof(node));if(pNode==NULL){printf("malloc error");exit(-1);}pthread_mutex_lock(&mutex);pNode->data=rand()%100;printf("p:[%d]\n",pNode->data);pNode->next=phead;phead=pNode;pthread_mutex_unlock(&mutex);pthread_cond_signal(&cond);sleep(1);}
}
void *consumer(void *arg)
{int n;while(1){n=*(int *)arg;pthread_mutex_lock(&mutex);if(phead==NULL){pthread_cond_wait(&cond,&mutex);}if(phead==NULL){pthread_mutex_unlock(&mutex);//先解锁,因为pthread_cond_wait会加一个锁continue;}node*pNode=phead;printf("c[%d]:[%d]\n",n,pNode->data);phead=phead->next;free(pNode);pNode=NULL;pthread_mutex_unlock(&mutex);sleep(1);}
}
int main()
{int i=0;int arr[5];pthread_mutex_init(&mutex,NULL);pthread_cond_init(&cond,NULL);pthread_t thread1;pthread_t thread2;int ret=pthread_create(&thread1,NULL,producer,NULL);if(ret!=0){printf("pthread_create1 error:[%s]\n",strerror(ret));return -1;}for(;i<5;i++)//创建5个消费者子线程{arr[i]=i;ret=pthread_create(&thread2,NULL,consumer,&arr[i]);if(ret!=0){printf("pthread_create2 error:[%s]\n",strerror(ret));return -1;}}pthread_join(thread1,NULL);pthread_join(thread2,NULL);pthread_mutex_destroy(&mutex);pthread_cond_destroy(&cond);return 0;
}
相关文章:

Linux的条件变量
条件变量 条件变量本身不是锁,但是它可以造成线程阻塞。通常于互斥锁配合使用。给多线程提供一个会和的场合。 使用互斥量保护共享数据使用条件变量可以造成线程阻塞,等待某个条件的发生,当条件满足的时候解除阻塞。 条件变量的两个动作&a…...

【Python笔记-设计模式】状态模式
一、说明 状态模式是一种行为设计模式,用于解决对象在不同状态下具有不同行为 (一) 解决问题 在对象行为根据对象状态而改变时,规避使用大量的条件语句来判断对象的状态,提高系统可维护性 (二) 使用场景 当对象的行为取决于其状态&#…...
Pytorch 复习总结 5
Pytorch 复习总结,仅供笔者使用,参考教材: 《动手学深度学习》Stanford University: Practical Machine Learning 本文主要内容为:Pytorch 卷积神经网络。 本文先介绍了 Pytorch 语法汇总: Pytorch 张量的常见运算、…...

Codeforces Round 930 (Div. 2)
Codeforces Round 930 (Div. 2) Codeforces Round 930 (Div. 2) A. Shuffle Party 题意: 给出长度为n的整数数组a, a i a_i ai i,对于k>2的下标进行运算,设d为k除本身外最大的除数, 操作为交换( a k a_k ak…...
c语言求平方与倒数序列的部分和
本题要求对两个正整数m和n(m≤n)编写程序,计算序列和m21/m(m1)21/(m1)⋯n21/n。 输入格式: 输入在一行中给出两个正整数m和n(m≤n),其间以空格分开。 输出格式: 在一行中按照“sum S”的格式输出部分和…...

Vue-4
自定义创建项目 目标:基于 VueCli 自定义创建项目架子 大致步骤: 安装脚手架创建项目 vue create 项目名称选择自定义 选择 Manually select features 这一项 step-1:按下空格 : 选择/取消--勾选请选择:Babel、Router、CSS、Linterstep-2…...

【Acwing】差分矩阵
图1:a和b数组映射表 由于a是b的前缀和数组,因此改变b[ x1][ y1]之后,受到影响的a中元素如右半图所示 图2:求b数组的前缀和 #include<bits/stdc.h> using namespace std;int n,m,q; int a[1010][1010]; int b[1010][1010]…...

Linux系统加固:如何有效管理系统账号
Linux系统加固:如何有效管理系统账号 1.1 口令重复次数限制1.2 避免系统存在uid相同的账号1.3 空密码的帐户1.4 口令复杂度1.5 口令生存期1.6 登录失败次数锁定策略 💖The Begin💖点点关注,收藏不迷路💖 在Linux系统中…...

在Windows中安装PyTorch
文章目录 1. 创建虚拟环境2. 检查显卡版本和CUDA3. 下载链接4. 下载5. 等待6. 检测 1. 创建虚拟环境 具体查看我之前写的 《在Windows中利用Python的venv和virtualenv创建虚拟环境》 2. 检查显卡版本和CUDA 这种情况是需要电脑上有单独的英伟达的显卡、或者英伟达的显卡和集显…...

助力智能化农田作物除草,基于YOLOv7【tiny/l/x】不同系列参数模型开发构建农田作物场景下玉米苗、杂草检测识别分析系统
在我们前面的系列博文中,关于田间作物场景下的作物、杂草检测已经有过相关的开发实践了,结合智能化的设备可以实现只能除草等操作,玉米作物场景下的杂草检测我们则少有涉及,这里本文的主要目的就是想要基于YOLOv7系列的模型来开发…...

linux nasm汇编中调用printf不报错,但调用scanf报错。抛出了分段错误(核心转储)
当我写了如下汇编时 ; nasm -f elf64 -g -F dwarf charsin.asm ; gcc charsin.o -no-pie -o charsin ; ld -o eatclib eatclib.o ; gdb eatclib[SECTION .data]SPrompt db Enter string data, followed by Enter: ,0IPrompt db Enter an integer value, followed by Enter: ,1…...

Linux系统——Nginx负载均衡模式
目录 一、Nginx优点 二、Nginx配置项——Conf Upstream 模块 三、Nginx负载均衡 1.负载均衡策略 1.1轮询 1.2IP_hash 1.3URL_hash 1.4Least_conn 1.5Weight 1.6Fair 2.Nginx负载均衡配置状态参数 3.什么是会话保持 3.1会话保持有什么作用呢 3.2Nginx会话保持 3…...
【自然语言处理之语言模型】讲解
自然语言处理之语言模型 1. 前言2. 传统语言模型3. 神经语言模型4. 训练语言模型5. 评估语言模型6. 总结 1. 前言 自然语言处理(Natural Language Processing,NLP)是计算机科学、人工智能和语言学交叉的一个领域,它研究计算机和人…...

输入一个整数n,输出这个整数的二进制的0和1的个数
输入一个整数n,输出这个整数的二进制的0和1的个数:除二取余法 代码: #include <cstdio> int main() {int n;scanf_s("%d", &n);int arr[2] { 0 };while (n) {int yu n % 2;arr[yu];n n / 2;}printf("0的个数是:…...

初阶数据结构:链表相关题目练习(补充)
目录 1. 单链表相关练习题1.1 移除链表元素1.2 反转链表1.3 链表的中间结点1.4 链表的倒数第k个结点1.5 合并两个有序链表1.6 链表分割1.7 链表的回文结构1.8 相交链表1.9 判断一个链表中是否有环1.10 寻找环状链表相遇点1.11 链表的深度拷贝 1. 单链表相关练习题 注࿱…...

java: 错误: 不支持发行版本 5
目录 一、问题描述 二、解决办法 方法一:修改idea设置中的jdk版本 方法二:配置pom.xml文件 方法三:配置maven的xml文件(推荐) 三、结果 一、问题描述 问题描述:今天创建了一个maven项目,…...
springSecruity--->和springboot结合的跨域问题
🤦♂️这个是我在springboot中使用springSecruity写一个小demo时遇到的问题,记录下来🤦♂️ 文章目录 跨域请求springboot项目中使用springSecruity导致跨域请求CrossOrigin请求失效解决方法springboot 中的跨域方法 跨域请求 什么是跨…...

网关kong记录接口处理请求和响应插件 tcp-log-with-body的安装
tcp-log-with-body 介绍 Kong的tcp-log-with-body插件是一个高效的工具,它能够转发Kong处理的请求和响应。这个插件非常适用于需要详细记录API请求和响应信息的情景,尤其是在调试和排查问题时。 软件环境说明 kong version 2.1.4 - 2.8.3 [可用亲测]C…...

ElasticSearch之Completion Suggester
写在前面 通过completion suggester可以实现如下的效果: 其实就是做的like xxx%这种。通过FST这种数据结构来存储,实现快速的前缀匹配,并且可以将es所有的数据加载到内存中所以速度completion的查询速度非常快。 需要注意,如果…...
ant 布局组件 组件等高设置
背景: 想实现一个和content等高的侧边栏,并增加侧边栏导航。 ant组件概述 Layout:布局容器,其下可嵌套 Header Sider Content Footer 或 Layout 本身,可以放在任何父容器中。Header:顶部布局,…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...

mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...