`

信号量与双缓冲

 
阅读更多
双缓冲
#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请自己动态调整,我只是为了测试生产者生产快或消费者消费更快而写的
分享到:
评论

相关推荐

    vc 双缓冲技术

    这可以通过各种同步原语来实现,例如互斥量、信号量或者读写锁。在VC++中,可以使用CriticalSection、Mutex或Semaphore类来实现这样的同步机制。 总的来说,双缓冲技术是提升图形界面性能的关键,而线程同步则是...

    DMA.zip_ADC DMA双缓冲_STM32F407+ADC+DMA_c51 dma_dma双缓冲区adc_双缓冲DMA

    在这个项目中,ADC(模拟数字转换器)与DMA(直接存储器访问)相结合,利用双缓冲技术进行数据采集,大大提升了数据处理的效率和系统的响应速度。 ADC(模拟数字转换器)是微控制器中的关键组件,它将模拟信号转换...

    使用双缓冲的串口通信程序

    5. 锁定机制:为了保证数据一致性,可能需要使用互斥锁或者信号量等同步机制来管理两个缓冲区的访问。 6. 错误处理:处理串口通信中的各种异常,如超时、数据错误等。 综上所述,"使用双缓冲的串口通信程序"是一种...

    服务器端双缓冲队列s/c

    这通常涉及到信号量、锁或者其他同步机制,确保在切换过程中不会出现数据丢失或混乱。 4. **同步机制**:如互斥锁(Mutex)、条件变量(Condition Variable)等,用于协调生产者和消费者线程的访问,保证数据一致性...

    FPGA的双缓冲模式PCI Express总线设计.pdf

    FPGA(现场可编程门阵列)技术是一种先进的数字电子设计技术,它允许工程师在硬件层面上编程和重构电子系统。...双缓冲模式在提高数据吞吐量和优化系统资源使用方面显示出了明显的优势,是值得推广的技术方案。

    信号量小书.........

    ### 信号量小书知识点概览 #### 一、书籍基本信息 - **书名**:《信号量小书》(The Little Book of Semaphores) - **作者**:Allen B. Downey - **版本**:第二版 - **版权**:本书遵循GNU自由文档许可证1.1或更...

    对话框双缓冲绘心电图图

    在IT领域,尤其是在图形用户界面(GUI)编程中,"对话框双缓冲绘心电图图"是一个典型的任务,涉及到图形渲染、数据处理以及用户体验优化。这个标题表明我们需要实现一个功能,即在对话框中使用双缓冲技术来绘制心电...

    WINCE上的WAVE文件播放器,支持播放双缓冲

    2. 缓冲管理:如何分配和管理两个缓冲区,以及如何在后台加载新的音频数据,需要考虑线程同步和信号量机制来确保安全。 3. 驱动交互:与WINCE的音频驱动进行通信,将缓冲区中的数据发送到硬件进行播放,可能涉及到...

    STM32F103 USART DMA不定长度数据接收+中断发送+FreeRTOS信号量

    单纯的驱动部分代码,使用时,须自行修改!使用DMA接收不定长度数据,中断发送。

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

    - 信号量是一种常用的同步机制,用于保护共享资源,确保同一时间只有一个任务可以访问环形缓冲区。 - 在访问环形缓冲区前,任务需要获取信号量;访问完成后释放信号量。 3. **改进读写指针的更新方式**: - 为了...

    STM32MP157 FreeRTOS实现任务通知模拟计数型信号量【支持STM32MP1系列单片机_FreeRTOS系统】

    与二进制信号量只能在0和1之间切换不同,计数型信号量可以有任意非负整数值。当一个任务获取信号量时,值会减1,直到值为0,表示资源已被完全占用;释放信号量时,值会加1,允许更多的任务访问资源。 在STM32MP157...

    DAC0832原理及直通、单缓冲、双缓冲三种工作方式.pdf

    "DAC0832原理及直通、单缓冲、双缓冲三种工作方式" DAC0832是一款8位数字到模拟转换器(D/A_converter),它可以将数字信号转换为模拟电压信号。下面是关于DAC0832的原理和三个工作方式的详细知识点: DAC0832原理...

    FREERTOS+USART+IDLE+DMA双缓冲接收,DMA发送和阻塞式发送

    在STM32中,FreeRTOS提供了任务调度、信号量、互斥锁等功能,确保了串行通信任务和其他任务的并发执行和优先级管理。 USART是微控制器中用于串行通信的标准外设,支持全双工通信,即可以同时进行发送和接收。在本...

    卷积实现:使用FIFO/线性缓冲区、双缓冲区、循环缓冲区和双循环缓冲区的卷积-matlab开发

    本文将深入探讨如何利用四种不同的缓冲区技术——FIFO(先进先出)缓冲区、双缓冲区、循环缓冲区和双循环缓冲区来实现卷积操作,并通过MATLAB进行开发。 首先,我们要理解卷积的基本概念。卷积是两个函数的积分,...

    基于P_V操作的进程同步与互斥实现.pdf

    这里可以使用两个信号量:一个表示缓冲区中可用于消费者消费的数据数量,另一个表示缓冲区中可用于生产者生产的空位数量。通过合理设置信号量的初始值和使用P_V操作来确保生产者和消费者之间的正确同步。 #### 教学...

    DMA_PWM103two.rar ,使用软件STM32cubeIDE在STM32F1上,tim2双缓冲点亮灯带ws2812灯带

    在本项目中,我们主要探讨的是如何利用STM32CubeIDE在STM32F1系列微控制器上通过DMA和TIM2的双缓冲机制来控制WS2812 RGB灯带。STM32F1是基于ARM Cortex-M3内核的微控制器,广泛应用于嵌入式硬件和单片机设计中,其...

    定时器+ADC+DMA+双缓冲 实现数据采集,adc采集dma输出,C/C++

    在本文中,我们将深入探讨如何在STM32F4微控制器上使用定时器、ADC(模拟数字转换器)、DMA(直接内存访问)以及双缓冲技术来实现高效的数据采集。STM32F4系列是意法半导体(STMicroelectronics)推出的高性能、低...

    STM32 环形缓冲

    5. **效率优化**:为了提高效率,可以使用双缓冲或多缓冲策略,使得在读取和写入数据时,可以同时进行其他处理,提高系统并行性。此外,合理选择缓冲区大小也至关重要,过大可能导致内存浪费,过小可能频繁触发溢出...

    基于stm32f407多通道数据采集,双buff,直接保存到sd卡

    双缓冲(Double Buffering)技术在数据采集系统中扮演了重要角色。它包括两个缓冲区,当一个缓冲区在进行数据采集时,另一个缓冲区则可用于数据处理或存储。这样可以避免因数据读写冲突导致的性能下降,提高了系统的...

    windows 缓冲池

    这通常通过互斥量(Mutex)、信号量(Semaphore)或者原子操作(Atomic Operation)来实现。 3. **并发控制**:可能使用锁或其他并发控制原语来防止多个线程同时访问和修改缓冲区。适当的并发控制可以避免死锁、...

Global site tag (gtag.js) - Google Analytics