首页 > 系统相关 >linux C++基于共享内存的同步机制

linux C++基于共享内存的同步机制

时间:2024-09-04 20:02:47浏览次数:8  
标签:END YUV pshm C++ yuv init linux 共享内存 shm

  1. 无缘进程间同步,本来打算使用有名信号量进行同步,但是有名信号量的初始化会受进程启动顺序影响,故使用共享内存进行封装,封装后的使用方法类似二值信号量,代码如下:
     1 #include <sys/ipc.h>    //ipc:inter-process communication进程通信
     2 #include <sys/shm.h>    //shm:share memory共享内存
     3 #include <stdio.h>
     4 #include <string>
     5 
     6 typedef enum
     7 {
     8     YUV_CAP_END=1000,
     9     YUV_READ_END,
    10     VENC_END,
    11     AENC_END,
    12 }SHM_KEY;
    13 
    14 class shm
    15 {
    16 private:
    17     /* data */
    18     int shmid_;
    19     unsigned char *pshm_ = NULL;
    20 public:
    21     void init(SHM_KEY key, unsigned char init_val){
    22         shmid_ = shmget(key, 4, IPC_CREAT | 0666);
    23         if(shmid_ == -1)
    24         {
    25             printf("shmget failed\n");
    26         }
    27         pshm_ = (unsigned char *)shmat(shmid_, 0, 0);
    28         memset(pshm_, 0, 4);
    29         pshm_[0] = init_val;
    30     };
    31 
    32     void wait()
    33     {
    34         while (pshm_[0] == 0);
    35         pshm_[0] = 0;
    36     }
    37     
    38     unsigned char get()
    39     {
    40         return pshm_[0];
    41     }
    42 
    43     void notify()
    44     {
    45         if (pshm_[0] != 1)
    46             pshm_[0] = 1;
    47     } 
    48 
    49     void release()
    50     {
    51         shmdt(pshm_);
    52         shmctl(shmid_, IPC_RMID, NULL);
    53     }
    54 
    55     explicit shm(SHM_KEY key, unsigned char init_val) {
    56         init(key, init_val);
    57     };
    58 
    59     shm()= delete;
    60     ~shm(){
    61         release();
    62     };
    63 };
  2. 也可以创建两个对象,作为生产-消费模式的同步使用,伪代码如下:
1 shm shm_yuv_cap(YUV_CAP_END, 0);
2 shm shm_yuv_read(YUV_READ_END, 1);
3 
4  shm_yuv_read.wait();
5  生产数据;
6  shm_yuv_cap.notify();
1 shm shm_yuv_cap(YUV_CAP_END, 0);
2 shm shm_yuv_read(YUV_READ_END, 1);
3 
4  shm_yuv_read.wait();
5 消费数据;
6  shm_yuv_cap.notify();

 

标签:END,YUV,pshm,C++,yuv,init,linux,共享内存,shm
From: https://www.cnblogs.com/aheng365/p/18397261

相关文章

  • Linux源码下生成并安装内核文档
    最近想使用man命令查看Linux内核函数的帮助信息,无奈有如下提示: xinu@slam:~$manprintkNomanualentryforprintk 而在Linux内核源码下,我们执行makehelp命令后,输出的提示内容有关于内核文档的如下信息:Documentationtargets: Linuxkernelinternaldocumentati......
  • 【为项目做准备】Linux网络编程重点知识(项目通用知识)
    Linux网络编程的简单梳理,不够再来更新~socket()setsockopt()bind()listen()accept()socket()socket()函数,用来创建套字节头文件:#include<sys/socket.h>函数:intsocket(intdomain,inttype,intprotocol)相应参数说明:-domain:指定套接字的地址族,常见的AF_INET......
  • 坐牢第三十五天(c++)
    一.作业1.使用模版类自定义栈代码:#include<iostream>usingnamespacestd;template<typenameT>//封装一个栈classstcak{private:T*data;//intmax_size;//最大容量inttop;//下标public://无参构造函数stcak();//......
  • 2024.9.4C++作业
    #include<iostream>#include<string>usingnamespacestd;classHuman{public:Human(){name="Unknown";age=0;}Human(stringn,inta){name=n;age=a;}~Hu......
  • 2024.9.3C++
    自行实现Mystring类#include<iostream>#include<cstring>usingnamespacestd;classmystring{public:mystring(){len=0;str=nullptr;}mystring(constchar*s){len=strlen(s);str=ne......
  • 2024.9.2C++作业
    自行实现一个Mystring类#include<iostream>#include<cstring>usingnamespacestd;classmystring{public:mystring(){len=0;str=nullptr;}mystring(constchar*s){len=strlen(s);str=n......
  • 【Linux入门】正则表达以及sort、uniq、tr、cut命令
    文章目录正则表达1.正则表达式(RegularExpressions)常用的正则表达式元字符:1.基本元字符2.字符类元字符3.特殊字符类4.边界匹配符5.控制字符和转义字符6.贪婪与非贪婪模式示例补充sort命令基本用法常用选项示例uniq命令基本用法常用选项示例tr命令基本用法常用......
  • C++基础之杂项
    目录思维导图:学习内容:1. Lambda表达式1.1基本概念1.2定义格式1.3常用情况二、异常处理2.1什么是异常处理2.2何时使用异常处理2.3异常处理的格式2.4异常实例2.5构造和析构中的异常 2.6系统提供异常类 三、C++中文件操作3.1文件流对象的介绍3.2关......
  • Windows 一顿操作倒逼用户!Linux 桌面坐收渔利,市场份额攀至新高峰
    根据StatCounter的最新数据,截至2024年7月,Linux在全球桌面操作系统的市场份额已达到4.45%。虽然这一百分比对于那些不熟悉操作系统领域的人来说可能看起来很小,但它对Linux及其专注的社区来说是一个重要的里程碑。更令人振奋的是Linux采用率的上升趋势。图片1.稳定进步......
  • Codeforces Round 971 (Div. 4) ABCD题详细题解(C++,Python)
    前言:    本文为CodeforcesRound971(Div.4)ABCD题的题解,包含C++,Python语言描述,觉得有帮助或者写的不错可以点个赞    比赛打了没一半突然unrated了就不是很想继续写了,早起写个题解    (之前的div3也没复盘,哎真菜)目录题A:题目大意和解题......