POSIX信号量

概念

信号量是一个计数器,用来描述临界资源数量的计数器。
每个执行流要进入临界资源时,要先申请信号量,出临界资源时,要释放信号量。
在这里插入图片描述
在这里插入图片描述
信号量的PV操作
P操作:申请信号量,进入临界资源前,会申请信号量,x–,如果x为0时,则会堵塞等待
V操作:释放信号量,出临界资源后,会释放信号量,x++

信号量函数

初始化信号量

int sem_init(sem_t *sem, int pshared, unsigned int value); 

参数:
sem: 输出型参数,信号量的标号
pshared:0表示线程间共享,非零表示进程间共享
value:信号量初始值 即x的值

销毁信号量

int sem_destroy(sem_t *sem);

等待信号量
功能:等待信号量,会将信号量的值减1

int sem_wait(sem_t *sem); //P操作 

发布信号量
功能:发布信号量,表示资源使用完毕,可以归还资源了。将信号量值加1。

int sem_post(sem_t *sem);//V操作

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

#pragma once
#include<iostream>
#include<vector>
#include<semaphore.h>
#include<pthread.h>
#include<cstdlib>
#include<ctime>
#include<unistd.h>

using namespace std;
template<class T>
class ringqueue
{
public:
    ringqueue(int cap=10):_cap(cap)
    {
        _rq.resize(cap);
        sem_init(&_room,0,cap);
        sem_init(&_data,0,0);
        pthread_mutex_init(&_mutexR,nullptr);
        pthread_mutex_init(&_mutexD,nullptr);
        _rIndex=_dIndex=0;
    }
    ~ringqueue()
    {
        sem_destroy(&_room);
        sem_destroy(&_data);
        pthread_mutex_destroy(&_mutexR);
        pthread_mutex_destroy(&_mutexD);
    }

    void push(const T& val)
    {
        //等待信号
        sem_wait(&_room);

        pthread_mutex_lock(&_mutexR);

        _rq[_rIndex]=val;

        _rIndex++;
        _rIndex%=_cap;
        pthread_mutex_unlock(&_mutexR);
        //发送信号
        sem_post(&_data);
    }

    T pop()
    {
        //等待信号
        sem_wait(&_data);

        pthread_mutex_lock(&_mutexD);
        T tmp = _rq[_dIndex];
        _dIndex++;
        _dIndex%=_cap;

        pthread_mutex_unlock(&_mutexD);
        //发送信号
        sem_post(&_room);
        return tmp;
    }


private:


private:
    vector<T> _rq ;//循环队列
    int _cap; // 大小
    int _rIndex; //空间对应的下标
    int _dIndex; //数据对应的下标
    sem_t _room; //剩余空间 
    sem_t _data; //已有数据
    pthread_mutex_t _mutexR; //空间锁
    pthread_mutex_t _mutexD; //数据锁

};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值