【Linux】POSIX信号量

1 认识信号量

前面的初识信号量

  • 信号量(信号灯):本质就是一个计算器
  • 信号量需要进行PV操作,P == -- ;V == ++ ,原子的!
  • 信号量是用来描述临界资源中资源数目的
    • 根据资源数目分成两类
    • 一个资源(整体资源):二元信号 == 互斥锁
    • 剩下就是多元信号
  • 每一个线程,在访问对应的资源的时候,先申请信号量,申请成功,表示允许该线程使用该资源,申请不成功,目前无法使用该资源!
  • 信号量的工作机制:信号量机制类似电影票的购买,是一种资源预定机制。
  • 信号量已经是资源的计数器了,申请信号量成功,本身就表明资源可用!申请信号量失败,本身就表明资源不可用 -- 资源是否存在的判断 就转化成为信号量的申请行为!

2 认识POSIX信号量的接口

初始化信号量

#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);
        参数:
                pshared:0表示线程间共享,非零表示进程间共享
                value:信号量初始值

销毁信号量

 int sem_destroy(sem_t *sem);

等待信号量

功能:等待信号量,会将信号量的值减1
int sem_wait(sem_t *sem); //P()

发布信号量

功能:发布信号量,表示资源使用完毕,可以归还资源了。将信号量值加1。
int sem_post(sem_t *sem);//V()

上一节生产者-消费者的例子是基于queue的,其空间可以动态分配,现在基于固定大小的环形队列重写这个程序(POSIX信号量):

3 基于环形队列的生产消费模型

3.1 结构模型分析

数据结构:循环队列的分析

队列是一个固定大小的队列,通过vector容器加循环下标来实现 

构建cp问题

  1. 消费者和生产者关心的问题是一样的吗?答:不一样,生产者关心空间,消费者关心数据
  2. 只要信号量不为0,表示资源可用,线程可以访问。
  3. 环形队列,只要我们访问不同的区域,生产者和消费者可以同时进行。
  4. 消费者和生产者什么时候在同一区域上?
    1. 两个人刚开始,没有数据的时候--空
    2. 环形队列,数据布满--满
  5. 指向同一个区域,两者之间存在竞争关系,应该让谁先运行?
    1. 空的时候,生产者
    2. 满的时候,消费者

消费者任务:向head中pop数据;生产者任务:向tail中push数据

游戏规则:

  1. 空时让生产者先走
  2. 满时让消费者先走
  3. 消费者不能超过生产者
  4. 生产者不能套圈消费者 

3.2 伪代码

 3.3 具体实现

#pragma once

#include <iostream>
#include <string>
#include <vector>
#include <semaphore.h>
#include <pthread.h>

const int N = 5;

template <class T>
class RingQueue
{
private:
    void P(sem_t *sem)
    {
        sem_wait(sem);
    }
    void V(sem_t *sem)
    {
        sem_post(sem);
    }
    void lock(pthread_mutex_t *mutex)
    {
        pthread_mutex_lock(mutex);
    }
    void unlock(pthread_mutex_t *mutex)
    {
        pthread_mutex_unlock(mutex);
    }

public:
    RingQueue(int num = N) : _capacity(num), _v(5), _head(0), _tail(0)
    {
        pthread_mutex_init(&_consumer_mutex, nullptr);
        pthread_mutex_init(&_producer_mutex, nullptr);
        sem_init(&_sem_data, 0, 0);
        sem_init(&_sem_room, 0, N);
    }

    ~RingQueue()
    {
        pthread_mutex_destroy(&_consumer_mutex);
        pthread_mutex_destroy(&_producer_mutex);
        sem_destroy(&_sem_data);
        sem_destroy(&_sem_room);
    }

    void push(const T &task)
    {
        P(&_sem_room);
        lock(&_producer_mutex);
        _v[_tail++] = task;
        _tail %= _capacity;
        unlock(&_producer_mutex);
        V(&_sem_data);
    }

    void pop(T *out)
    {
        P(&_sem_data);
        lock(&_consumer_mutex);
        *out = _v[_head++];
        _head %= _capacity;
        unlock(&_consumer_mutex);
        V(&_sem_room);
    }

private:
    std::vector<T> _v;
    int _capacity;
    int _head;
    int _tail;
    sem_t _sem_data;
    sem_t _sem_room;
    pthread_mutex_t _consumer_mutex;
    pthread_mutex_t _producer_mutex;
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM类加载

一、类记载过程 1、通过类的全限定名获取存储该类的class文件 2、解析成运行时数据&#xff0c;即instanceKlass实例&#xff0c;存放到方法区 3、在堆区生成该类的class对象,即instanceMirrorKlass实例 二、将.class文件解析成什么&#xff1f;类的元信息在JVM中如何…

IOS UICollectionView 设置cell大小不生效问题

代码设置flowLayout.itemSize 单元格并没有改变布局大小&#xff0c; 解决办法如下图&#xff1a;把View flow layout 的estimate size 设置为None&#xff0c;上面设置的itemSize 生效了。

系统架构设计师-软件架构设计(5)

目录 一、构件与中间件技术 1、软件复用 2、构件与中间件技术的概念 3、构件的复用 3.1 检索与提取构件 3.2 理解与评价构件 3.3 修改构件 3.4 组装构件 4、中间件 4.1 采用中间件技术的优点&#xff1a; 4.2 中间件的分类&#xff1a; 5、构件标准 5.1 CORBA&#xff08;公共…

【弹力设计篇】弹力设计总结

前面主要聊了多个弹力设计&#xff0c;遮盖力主要做一个汇总 弹力设计总图 集群&#xff1a;服务不能是单点的&#xff0c;所以我们的架构需要冗余设计&#xff0c;设计成集群服务&#xff0c;也就是多个副本机制。需要具体的技术 负载均衡服务健康检查&#xff0c;使用像Ng…

【单谐波非线性振动问题求解器 GUI 】使用单个谐波表示解决 MDOF 非线性振动问题(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码实现 &#x1f4a5;1 概述 对于解决多自由度&#xff08;MDOF&#xff09;非线性振动问题&#xff0c;使用单个谐波表示是一种常见的近似方法。这种方法将系统的非线性部…

使用3ds Max粒子系统创建飞天箭雨特效场景

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. 设置箭头 步骤 1 打开 3ds Max。 打开 3ds Max 步骤 2 我使用多边形建模技术制作了一个简单的箭头&#xff0c;我将 在教程中使用。.max您可以从 下载部分。 箭头.max 步骤 3 将此箭头重命名为静态…

Stability AI推出Stable Diffusion XL 1.0,文本到图像模型

Stability AI宣布推出Stable Diffusion XL 1.0&#xff0c;这是一个文本到图像的模型&#xff0c;该公司将其描述为迄今为止“最先进的”版本。 Stability AI表示&#xff0c;SDXL 1.0能生成更加鲜明准确的色彩&#xff0c;在对比度、光线和阴影方面做了增强&#xff0c;可生成…

【JavaSE】运算符

【本节目标】 1. 熟练掌握各种运算符 这部分内容和C语言的位运算相似&#xff0c;可以参考这篇文章&#xff1a;【C语言】操作符详解 目录 1. 什么是运算符 2. 算术运算符 3. 关系运算符 4. 逻辑运算符 5. 位运算符 6. 移位运算(了解) 7. 条件运算符 1. 什么是运算符 …

用JavaScript和HTML实现一个精美的计算器

文章目录 一、前言二、技术栈三、功能实现3.1 引入样式3.2 编写显示页面3.2 美化计算器页面3.3 实现计算器逻辑 四、总结 一、前言 计算器是我们日常生活中经常使用的工具之一&#xff0c;可以帮助我们进行简单的数学运算。在本博文中&#xff0c;我将使用JavaScript编写一个漂…

如何解决大数据下滚动页面卡顿问题

原文合集地址如下&#xff0c;有需要的朋友可以关注 本文地址 合集地址 前言 之前遇到不分页直接获取到全部数据&#xff0c;前端滚动查看数据&#xff0c;页面就听卡顿的&#xff0c;当然这和电脑浏览器性能啥的还是有点关系。但根源还是一次性渲染数据过多导致的&#xf…

RTPS规范v2.5(中文版)

实时发布订阅协议 DDS互操作性有线协议 &#xff08;DDSI-RTPS&#xff09; 技术规范 V2.5 &#xff08;2022-04-01正式发布&#xff09; https://www.omg.org/spec/DDSI-RTPS/2.5/PDF   目 录 1 范围 8 2 一致性 8 3 规范性参考文献 8 4 术语和定义 9 5 标识 …

计算机和医学的交叉融合到底有多强呢?

目录 简介 人工智能在医学诊断中的应用 计算机辅助药物研发 计算机技术在基因组学研究中的应用 数字病理学 穿戴式医疗设备 虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;技术在医学教育中的应用 机器人手术 区块链技术在医学领域的应用 遥…

【GoLang】MAC安装Go语言环境

小试牛刀 首先安装VScode软件 或者pycharmmac安装brew软件 brew install go 报了一个错误 不提供这个支持 重新brew install go 之后又重新brew reinstall go 使用go version 可以看到go 的版本 使用go env 可以看到go安装后的配置 配置一个环境变量 vim ~/.zshrc, # bre…

UEditor 百度富文本编辑器使用 遇到问题

小小吐槽 碰到前后不分离项目&#xff0c;富文本使用的UEdtior UEditor 点击上传图片转base64 在ueditor.all.js文件中找到这个 callback()函数 这里使用根据图片的url转成base64 UEditore 粘贴图片转base64 UEditor回显图片&#xff08;base64&#xff09; 把ueditor.all…

css 书写规范!其他人总结!

CSS书写顺序 1.位置属性(position, top, right, z-index, display, float等) 2.大小(width, height, padding, margin) 3.文字系列(font, line-height, letter-spacing, color- text-align等) 4.背景(background, border等) 5.其他(animation, transition等) CSS书写规范 使用…

免费的音频转换器带你突破音频格式束缚

曾经有一个名叫吴欢的音乐爱好者&#xff0c;他热爱收集各种音频文件&#xff0c;从经典的老歌到新潮的流行曲&#xff0c;样样都不放过。然而&#xff0c;他遇到了一个令人头疼的问题&#xff1a;因为音频格式的不同&#xff0c;他无法将一些珍贵的音乐记录转化为文字形式。他…

IDEA代码自动格式化工具

1.自动import 在IDEA中&#xff0c;打开 IDEA 的设置&#xff0c;找到 Editor -> General -> Auto Import。勾选上 Add unambiguous imports on the flyOptimize imports on the fly (for current project) 2.gitee 提交格式化 设置方法如下: 1.打开设置 2.找到版本…

React Native实现震动反馈效果

React Native实现理想的震动效果 一、背景说明 业务开发中&#xff0c;总会用到一些和用户反馈的效果&#xff0c;用来提升用户对于某个事件或者操作的重要程度&#xff0c;比如常见的就是 长按复制、滑动或点击图表、点击底部TabBar时的反馈等操作。 二、构思实现及过程 2.…

数据结构基本概念及算法分析

文章目录 1. 数据结构基本概念1.1 基本概念和术语1.1.1 数据1.1.2 数据元素1.1.3 数据项1.1.4 数据对象1.1.5 数据结构 1.2 逻辑结构与物理结构1.2.1 逻辑结构(我们最需要关注的问题)1.2.2 物理机构 1.3 数据类型1.3.1 数据类型定义1.3.2 抽象数据类型 2. 算法分析2.1 算法的复…

pytest 自定义HOOK函数

除了系统提过的HOOK函数外&#xff0c;也可以通过自定义HOOK的方式实现想要的功能。 首先创建一个py文件&#xff0c;里面定义自己的HOOK函数&#xff0c;主要pytest里面的hook函数必须以pytest开头。 #myhook.pydef pytest_myhook(user):"""自定义HOOK函数&q…