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

生产者、消费者问题(C语言、POSIX)

利用C语言编写,使用POSIX线程,利用条件变量和互斥锁来完成资源调用和实现线程同步。代码如下:

//生产者和消费者问题
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
char g_storage[10];//仓库
int g_stock = 0;//库存量
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//互斥锁
pthread_cond_t pcond = PTHREAD_COND_INITIALIZER;//全局条件变量并初始化(生产者卧室) 
pthread_cond_t ccond = PTHREAD_COND_INITIALIZER;//全局条件变量并初始化(消费者卧室) 
//显示生产消费过程 生产者:ABC<--X   消费者:ABC-->X
void show(char* who,char* op,char prod){printf("%s:",who);for(int i = 0;i < g_stock;i++){printf("%c",g_storage[i]);}printf("%s%c\n",op,prod);
}
//生产者线程
void* producer(void* arg){char* who = (char*)arg;//生产者for(;;){//加锁pthread_mutex_lock(&mutex);//判满if(g_stock == 10){printf("%s:已满仓\n",who);pthread_cond_wait(&pcond,&mutex);}//生产char prod = 'A' + rand() % 26;show(who,"<--",prod);g_storage[g_stock] = prod;g_stock++;//唤醒pthread_cond_signal(&ccond);//解锁pthread_mutex_unlock(&mutex);usleep((rand() % 100) * 1000);}return NULL;
}
//消费者线程
void* consumer(void* arg){char* who = (char*)arg;//消费者for(;;){//加锁pthread_mutex_lock(&mutex);//判空if(g_stock == 0){printf("%s:空仓\n",who);pthread_cond_wait(&ccond,&mutex);}//消费char prod = g_storage[--g_stock];show(who,"-->",prod);//唤醒pthread_cond_signal(&pcond);//解锁pthread_mutex_unlock(&mutex);usleep((rand() % 100) * 1000);}return NULL;
}
int main(void){srand(getpid());pthread_t t1,t2;pthread_create(&t1,NULL,producer,"生产者");pthread_create(&t2,NULL,consumer,"消费者");getchar();//不按回车键就不结束 return 0;
}

http://www.dtcms.com/a/273000.html

相关文章:

  • 测试覆盖标准-条件覆盖-短路求值
  • 全新开源AI知识库系统!PandaWiki一键构建智能文档,支持AI问答、创作与搜索!
  • [特殊字符] 05_Jenkins 部署前端项目实现自动化部署
  • rv1106使用笔记
  • 【RL-VLM-F】算法框架图绘图学习笔记
  • ubuntu server配置静态IP
  • ​​​​​​​微软PowerBI PL-300认证考试报名入口及费用
  • 【PTA数据结构 | C语言版】顺序队列的3个操作
  • 完美卸载 Ubuntu 双系统:从规划到实施的完整指南
  • 乐鑫代理商飞睿科技,ESP32模组重塑AIoT体验的四大技术支柱
  • C++类型萃取(Type Traits):深入解析std::enable_if与std::is_same
  • git fetch的使用
  • 【第五章-基础】Python 函数---以一个初学者来理解函数
  • 第十六天,7月10日,八股
  • 【网络安全】利用 Cookie Sandwich 窃取 HttpOnly Cookie
  • vue中token的使用与统计实践
  • android闪光灯源码分析
  • Android 插件化实现原理详解
  • 【读书笔记】如何画好架构图:架构思维的三大底层逻辑
  • 遥感影像图像分割-地物提取模型训练与大图直接推理流程
  • 突破传统局限:60G 3D毫米波雷达如何实现精准人体全状态检测?
  • Vue3基础知识
  • 论文笔记(LLM distillation):Distilling Step-by-Step!
  • 5、Vue中使用Cesium实现交互式折线绘制详解
  • 电脑被突然重启后,再每次打开excel文件,都会记录之前的位置窗口大小,第一次无法全屏显示。
  • imx6ul Qt运行qml报错This plugin does not support createPlatformOpenGLContext!
  • 无人机抗风模块运行与技术难点分析
  • Flowable22变量监听器---------------持续更新中
  • OneFileLLM:一键聚合多源信息流
  • 股指期货交割交易日到期没平仓盈亏以哪个价格计算?