`

信号量与双缓冲

 
阅读更多
双缓冲
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>
#include <vector>
#include <iostream>
using namespace std;

vector<int> v1;
vector<int> v2;

sem_t semaphore;
unsigned int vectorSize = 5;
bool pushV1=true,pushV2=false;

pthread_mutex_t mutexV1,mutexV2;

void *producer(void */*arg*/)
{
    int i=1,j=11;
    while(1)
    {
        if(pushV1)
        {
            pthread_mutex_lock(&mutexV1);
            v1.push_back(i);
            cout << "push back vector1:" << i << ",size:" <<v1.size() << endl;
            i++;
            if(v1.size()>=vectorSize)
            {
                pushV1 = false;
                pushV2 = true;
                i = 1;
                sem_post(&semaphore);
            }
            pthread_mutex_unlock(&mutexV1);
        }else if(pushV2)
        {
            pthread_mutex_lock(&mutexV2);
            v2.push_back(j);
            cout << "push back vector2:" << j << ",size:" <<v2.size() << endl;
            j++;
            if(v2.size()>=vectorSize)
            {
                pushV2 = false;
                pushV1 = true;
                j = 11;
                sem_post(&semaphore);
            }
            pthread_mutex_unlock(&mutexV2);
        }
        usleep(200*1000);
    }
    return 0;
}

void *consumer(void */*arg*/)
{
    while (1)
    {
        sem_wait(&semaphore);
        if(pushV2)
        {
            pthread_mutex_lock(&mutexV1);
            if(v1.size()>0)
            {
                while(v1.size()>0)
                {
                    int i = *v1.begin();
                    v1.erase(v1.begin());
                    cout << "vector1 pop:" << i <<",size:" << v1.size() << endl;
                    usleep(100*1000);
                }
            }
            pthread_mutex_unlock(&mutexV1);
        }else if(pushV1)
        {
            pthread_mutex_lock(&mutexV2);
            if(v2.size()>0)
            {
                while(v2.size()>0)
                {
                    int i = *v2.begin();
                    v2.erase(v2.begin());
                    cout << "vector2 pop:" << i <<",size:" << v2.size() << endl;
                    usleep(100*1000);
                }
            }
            pthread_mutex_unlock(&mutexV2);
        }
        usleep(5*1000);
    }
    return 0;
}

int main()
{
    pthread_t consumerThread,producerThread;

    if(pthread_mutex_init(&mutexV1,NULL)!=0)
    {
        pthread_mutex_destroy(&mutexV1);
        perror("init mutex fail");
    }
    if(pthread_mutex_init(&mutexV2,NULL)!=0)
    {
        pthread_mutex_destroy(&mutexV2);
        perror("init mutex fail");
    }
    int res = sem_init(&semaphore, 0, 0);
    if (res != 0)
    {
        perror("Semaphore initialization failed");
    }
    res = pthread_create(&consumerThread, NULL, consumer, NULL);
    if (res != 0)
    {
        perror("Thread creation failure");
    }
    res = pthread_create(&producerThread, NULL, producer, NULL);
    if (res != 0)
    {
        perror("Thread creation failure");
    }
    while (1)
    {
        sleep(5);
    }
    sem_destroy(&semaphore);
}



}

那些usleep请自己动态调整,我只是为了测试生产者生产快或消费者消费更快而写的
分享到:
评论

相关推荐

    一个c++环形队列缓冲区

    环形缓冲区读写操作的分析与实现,以及在并发条件下如何控制竞争

    操作系统(第二版)习题答案

    与时间有关的错误,资源竞争——互斥,协同工作——同步,信号量,信号量上的P、V操作,用P、V操作实现互斥,用P、V操作实现同步,用P、V操作实现资源分配,死锁,死锁产生的必要条件,死锁的预防,死锁的避免,...

    DSP中的基于DSP双路音频信号实时处理系统设计

    现代音频信号处理领域,通常需要采集大量...该系统利用DSP进行数据处理,DMA与McBSP实现双路音频信号的实时并行采集发送,便于实验室进行数据分析、算法仿真和过优化处理流程等,也可用于个人便携式音频通信设备的驱动

    用多线程同步方法演示“生产者-消费者”问题

    1、设计目的:通过研究Linux的进程同步机制和信号量,实现生产者消费者问题的并发控制。 2、说明:有界缓冲区内设有26个存储单元,放入取出的产品设定为26个大写英文字母。 3、设计要求: 1) 生产者与消费者均有二个...

    电压电平转换指南

    压转换产品系列,其中包括双电源供电电 平转换器;适用于推挽式缓冲和漏极开路 应用的自动方向检测转换器;以及专为适 应当今层出不穷的信号标准而优化的混合 专用转换器。诸如消费类电子、便携式、 计算以及网络...

    高级UNIX编程 pdf 电子书

    7.9 System V信号量 7.10 POSIX信号量 7.11 文件锁 7.12 关于共享内存 7.13 System V共享内存 7.14 POSIX共享内存 7.15 性能比较 练习 第8章 网络和套接字 8.1 套接字基础 8.2 套接字地址 8.3 套接字选项 8.4 简单套...

    电子系统设计报告.doc

    而双缓冲方式适用于在需要同时输出几路模拟信号的 场合,每一路模拟量输出需一片DAC0832芯片,构成多个DAC0832同步输出电路,程序简 单化,但是电路线路连接比较复杂。根据以上分析,我们的课题选择了单缓冲方式使用...

    FIFO.rar_FIFO clock_RAM FIFO_buffer vhdl_fifo vhdl_双时钟RAM

    设计了一个具有双时钟信号,双复位信号的FIFO,用于FPGA中的数据缓冲,RAM的定义是参数型,可以根据自己的需求,修改此参数,完成RAM的容量扩展。程序中有详细的说明

    《计算机操作系统》期末复习指导

    信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意信号量的值仅能由PV操作来改变。 一般来说,信号量S 0时,S表示...

    linux programming instances网络编程教程 附源代码

    2.3.2 信号量的创建和操作 2.4 共享内存区 2.4.1 共享内存区的数据结构 2.4.2 共享内存区的创建和操作 2.4.3 实例 2.4.4 共享内存区的限制 2.5 本章小结 第3章 传输层协议tcp和udp 3.1 tcp/ip基本框架...

    Pr65教学.rar

    Attack和 Release分别指压缩的起始时间和释放时间,即当输入信号超出Threshold时,程序并不是立即按照Ratio进行压缩,而是根据Attack的设置经过一段时间的缓冲后才开始压缩,而当输入信号压缩到Threshold 时,也不是...

    电源技术中的LTC4300A系列为背板I2C总线提供电容性缓冲

    LTC4301是一个不依赖电源、能够热插拔的双线总线缓冲器,能允许I/O线路卡插入带电的背板而不需考虑对数据总线(SDA)的以及时钟线(SCL)的信号破坏。该集成电路在背板和线路板的I2C总线之间提供了隔离缓冲,无论对应的...

    单片机与DSP中的DSP的软件UART实现

    1前言 ...除此之外,ADSP218X还有强大的系统接口,有两个带有自动压扩功能的双缓冲串口。ADSP218X的串口属于同步串口,与标准的异步串行接口不同,要想实现ADSP218X与PC机串口的通信,我们必须在DSP中

    程控交换实验、用户模块电路 主要完成BORSCHT七种功能,它由下列电路组成:

    控制部分就是由CPU中央处理系统、输入电路(键盘)、输出电路(数码管)、双音多频DTMF检测电路、用户环路状态检测电路、自动交换网络驱动电路与交换网络转换电路、扩展电路、信号音控制电路等电路组成。 下面简要...

    基于MCS51单片机温度控制系统

    温度是一种变化时间常数较大的物理量,对A/D转换速度要求不高,因此,在设计中选用了压控振荡器,先将电压信号转化为频率量,再通过控制器的计数功能转化为数字信号,这样可以大大提高精度,节约成本。 压控振荡器...

    TMS320X28xx处理器外设功能A/D转换模块介绍

    C281x DSP上的ADC模块将外部的模拟信号转换为数字量,通过转换控制信号进行滤波或者实现运动系统的闭环... ●2个双缓冲的数据寄存器缩短了提取结果所需要的中断开销;  ●多达16个多路复用模拟输人通道;  ●转换

    EDA/PLD中的TMS320X28xx处理器外设功能A/D转换模块介绍

    C281x DSP上的ADC模块将外部的模拟信号转换为数字量,通过转换控制信号进行滤波或者实现运动系统的闭环... ●2个双缓冲的数据寄存器缩短了提取结果所需要的中断开销;  ●多达16个多路复用模拟输人通道;  ●转换

    关于8335A的一些说明

    DB37的引脚与开关量等信号的对照关系见下表: 插座引脚号 信 号 定 义 插座引脚号 信 号 定 义 DB37_1 DI0 DB37_20 DI1 DB37_2 DI2 DB37_21 DI3 DB37_3 DI4 DB37_22 DI5 DB37_4 DI6 DB37_23 DI7 DB37_5 DI8 DB37_24 ...

    ADC809的运用及电路

    从图中可以看到,把ALE信号与START信号接在一起了,这样连接使得在信号的前沿写入(锁存)通道地址,紧接着在其后沿就启动转换。图9.19是有关信号的时间配合示意图。 启动A/D转换只需要一条MOVX指令。在此之前,要...

    深入分析Linux内核源码

    4.8.1信号量 4.8.2原子操作 4.8.3 自旋锁、读写自旋锁和大读者自旋锁 4.9 本章小节 第五章进程调度 5.1 Linux时间系统 5.1.1 时钟硬件 5.1.2 时钟运作机制 5.1.3 Linux时间基准 5.1.4 Linux的时间...

Global site tag (gtag.js) - Google Analytics