`

信号量

 
阅读更多

#include <semaphore.h>
#include <fcntl.h>
#include <iostream>
#include <vector>
#include <unistd.h>
using namespace std;

sem_t semProducer,semConsumer;
vector<int> v;

void* producer(void*)
{
    while(1)
    {
        if(v.size()>=5)
        {
            sem_post(&semConsumer);
            sem_wait(&semProducer);
        }else
        {
            v.push_back(1);
            cout << "push,size:" << v.size() << endl;
            sleep(1);
        }
    }
    pthread_detach(pthread_self());
    return 0;
}

void* consumer(void*)
{
    while(1)
    {
        if(v.empty())
        {
            sem_post(&semProducer);
            sem_wait(&semConsumer);
        }else
        {
            v.pop_back();
            cout << "pop,size:" << v.size() << endl;
            sleep(1);
        }
    }
    pthread_detach(pthread_self());
    return 0;
}

int main()
{
    sem_init(&semProducer,0,0);
    sem_init(&semConsumer,0,1);
    pthread_t pidProducer,pidConsumer;
    pthread_create(&pidProducer,NULL,producer,NULL);
    pthread_create(&pidConsumer,NULL,consumer,NULL);
    sleep(10);
    cout << "destroy ret:" << sem_destroy(&semConsumer) << endl;
    cout << "destroy ret:" << sem_destroy(&semProducer) << endl;
}

push,size:1
push,size:2
push,size:3
push,size:4
push,size:5
pop,size:4
pop,size:3
pop,size:2
pop,size:1
pop,size:0
destroy ret:0
destroy ret:0


等待超时终止
#include <semaphore.h>
#include <iostream>
#include <sys/time.h>
#include <unistd.h>
using namespace std;
sem_t sem;

void* testWait(void*)
{
    while(1)
    {
        sleep(10);
        sem_post(&sem);
        cout << "post sem" << endl;
    }
    pthread_detach(pthread_self());
    return 0;
}

int main()
{
    sem_init(&sem,0,0);
    pthread_t pidWait;
    pthread_create(&pidWait,NULL,testWait,NULL);
    struct timespec timeEnd;
    struct timeval timeNow;
    gettimeofday(&timeNow,NULL);
    timeEnd.tv_sec = timeNow.tv_sec+5;
    sem_timedwait(&sem,&timeEnd);
    cout << "wait finished" << endl;
    sleep(10);
    cout << "destroy ret:" << sem_destroy(&sem) << endl;
}

wait finished
post sem
destroy ret:0



分享到:
评论

相关推荐

    c语言信号量的使用实例

    ### c语言信号量的使用实例 #### 一、信号量的基本概念 信号量是一种用于解决进程间同步问题的机制,在多线程或多进程环境中尤为重要。它通过控制共享资源的访问来避免竞态条件,确保数据的一致性。信号量本质上是...

    c++多线程同步——信号量

    信号量(Semaphore)是实现多线程同步的一种有效工具,常用于控制对共享资源的访问。在这个名为"Mthread11"的MFC工程中,我们可以看到如何在C++环境中应用信号量来解决多线程间的同步问题。 首先,我们需要理解什么...

    信号量的应用

    "信号量的应用" 信号量是一种在多线程环境下使用的设施,用于保证两个或多个关键代码段不被并发调用。信号量的作用类似于一个看门人,控制着公共资源的访问,确保资源的安全使用。 信号量的特性可以抽象地认为是一...

    操作系统之信号量练习题

    为此,定义了三个接收信号量S2、S3、S4,P1发送一条消息前会检查这三个信号量,确保每个接收进程都已做好准备。 第四个问题涉及三个进程共享表格F,其中P1只读,P2只写,P3先读后写。这里使用了两个信号量Rmutex和...

    理发师问题-信号量PV操作实现

    理发师问题-信号量PV操作实现 本文探讨了理发师问题的解决方案,该问题是一个经典的多进程同步问题。通过使用信号量PV操作,实现了多线程同步,解决了理发师问题。下面是该解决方案的详细介绍。 信号量PV操作 ...

    硬件信号量在多核处理器核间通信中的应用

    硬件信号量模块由64个独立的信号量组成,这些信号量不与硬件资源或核直接绑定,而是根据每个核处理任务的负载进行动态分配。硬件信号量的访问方式包括直接访问、间接访问和查询方式,这三种方式在软件层面上的实现都...

    LT-ARM214X学习板ucos任务间信号量通信实验

    3. **信号量的创建与操作**:学习如何使用`OSSemaphoreCreate`创建信号量,`OSSemaphorePend`获取信号量(等待),以及`OSSemaphorePost`释放信号量(唤醒等待的任务)。 4. **任务间通信**:通过信号量,不同任务...

    rt-thread信号量_holecev_RT-Thread_rtthread信号量_信号量_

    "holecev"可能是作者或项目的别名,而"RT-Thread_rtthread信号量_信号量_"则是强调了这个资料主要关注RT-Thread中的信号量机制。 信号量在RT-Thread中的应用主要包括以下方面: 1. **同步**:当多个线程需要协同...

    信号量的理解

    信号量是一种在多任务操作系统中实现资源管理和任务同步的重要机制,尤其在嵌入式系统如UCOSii中广泛应用。本文将深入探讨信号量的理解、其有效性、相关函数以及互斥型信号量及其带来的优先级反转问题。 首先,UCOS...

    使用共享内存及信号量实现进程间通信例子

    `semget`用于创建信号量集,`semop`执行信号量操作(如P(等待)和V(释放)操作),`semctl`用于管理信号量集,如初始化或删除。 在实际应用中,信号量常与共享内存结合使用,确保对共享内存的访问是同步的。例如...

    哈工大软件学院操作系统实验4——信号量的实现和应用

    操作系统是计算机科学中的核心课程,而信号量是操作系统中一种重要的同步机制,它在多进程或多线程环境下用于协调共享资源的访问。哈工大软件学院的操作系统实验4聚焦于信号量的实现与应用,旨在让学生深入理解并...

    操作系统实验-信号量机制实现进程同步

    信号量分为两种类型:整型信号量和记录型信号量。整型信号量只包含一个整数值,而记录型信号量则包含一个整数值和一个等待队列。在本实验中,你可能会使用PV操作来管理共享资源的访问,确保并发进程的正确调度。 总...

    labview,2018,信号量-获取信号量-释放信号量

    labview,2018,信号量__获取信号量_释放信号量

    有关水果问题的信号量程序

    信号量机制是操作系统中一种重要的同步工具,常用于解决多线程环境中的资源竞争问题。本问题中,通过“爸爸放苹果,妈妈放橘子,盘子只能容纳两个水果。儿子只吃苹果,女儿只吃橘子”的情景,我们可以深入理解信号量...

    19,信号量_rtthread_STM32F103_RTT_信号量_

    本文将深入探讨标题"19,信号量_rtthread_STM32F103_RTT_信号量_"所涉及的关键知识点,包括RT-Thread(RTT)在STM32F103微控制器上的应用,以及信号量的两种主要类型:二值信号量和计数信号量。 首先,RT-Thread是...

    STM32的UCOSII信号量程序,亲测可用

    4. **信号量操作**:有三个主要的信号量操作:`OSSemPend()`用于获取信号量,如果信号量不可用,则任务会被挂起;`OSSemPost()`用于释放信号量,增加信号量的计数值;`OSSemDel()`用于删除不再使用的信号量。 5. **...

    基于FreeRTOS二值信号量程序设计_stm32_二值信号量_

    这种信号量主要用于资源的互斥访问,即在任何时刻只有一个任务可以持有信号量。当一个任务获取到信号量时,信号量状态变为被占用;当任务完成对资源的访问后,必须释放信号量,让其他任务有机会获取。 在FreeRTOS中...

    易语言多线程控制:信号量控制线程数量

    信号量值可以用来表示资源的可用数量,当线程试图获取一个资源时,如果信号量值大于零,那么线程可以继续执行并减少信号量值;如果信号量值为零,则线程会被阻塞,直到其他线程释放资源,信号量值增加。 首先,我们...

    µCOS-II 信号量试验——哲学家就餐问题

    µCOS-II 信号量试验——哲学家就餐问题 本实验报告旨在介绍µCOS-II操作系统下的信号量试验,通过经典的哲学家就餐问题实验,了解如何利用信号量来对共享资源进行互斥访问。 一、信号量概述 在µCOS-II操作系统...

    QT 下 信号量使用

    在QT框架中,信号量(Semaphore)是一种非常重要的同步机制,它源于进程间通信(IPC)的概念,并在多线程编程中广泛使用。信号量允许我们控制对共享资源的访问,确保同一时间只有一个线程或者有限数量的线程能够访问...

Global site tag (gtag.js) - Google Analytics