IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> linux信号量 的消费者与生产者模型 -> 正文阅读

[C++知识库]linux信号量 的消费者与生产者模型

一 回顾

1 因为临界资源空的原因 在上一节引出了一个条件变量 (不是一把锁)
2 又通过条件变量 引出了生产者和消费者的模型  并且消费者是主导地位 他不会生产节点  只会消耗 
3 消费者 在等待阻塞实际上是 帮了 生产者解锁  让生产者工作  
完了之后就会释放资源   最后就会告诉消费者 可以吃饼了  
4 消费者为了 保护临界资源  会先进行加锁  最后才是解锁   这样的饼就吃的安心了

二 信号量函数

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

因为信号量就是一把锁  直接画图 演示 

在这里插入图片描述

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>

typedef struct node
{
    int data;
    struct node *next;

}Node;

Node *head=NULL;//创建 头 结点并且初始化


sem_t sem1;//定义为生产者的信号量 
sem_t sem2;//定义为消费者的信号量 

void *durporcer(void *arg)
{

    while(1)
    {
          Node *news=(Node *)malloc(sizeof(Node));//开辟空间

          news->data=rand()%1000;//赋值

          sem_wait(&sem1); // 消费者 帮助解锁   那么他现在就变成了 4-1 把锁 
          
          news->next=head;//临界资源
          head=news;//临界资源

          printf("durporcer is ===%d\n",news->data);//临界资源

          sem_post(&sem2);//给消费者发送信号 你可以吃饼了 (信号 在 ++)
          sleep(rand()%3);
    }

}

void *customer(void *arg)
{
    while(1)
    {
         sem_wait(&sem2);//给生产解锁的同时 自己是阻塞的 
          
          Node *semm=head;//收到信号   并且现在为阻塞  

          head=head->next;//大胆吃饼了 //临界资源

          printf("customer is ===%d\n",head->data);//临界资源
        
          sem_post(&sem1);//给生产发送信号 我吃完了  麻烦继续 生产  (信号 在 ++)
          
          sleep(rand()%3);

    }
}

 void main()
 {

     pthread_t  p1,p2;
     
     sem_init(&sem1,0,4);//给生产者 分配 4个 锁 
     sem_init(&sem2,0,0);//给消费者  分配 0个锁 
     
     pthread_create(&p1,NULL,durporcer,NULL);
     pthread_create(&p2,NULL,customer,NULL);

     pthread_join(p1,NULL);
     pthread_join(p2,NULL);
          
     sem_destroy(&sem1);//销毁 生产者 
     sem_destroy(&sem2);//销毁 消费者  


 }


在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-09 12:22:52  更:2022-05-09 12:23:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 0:56:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码