Linux信号量(简易版)

Sem.hpp(用于封装信号量):

cpp 复制代码
#include<iostream>
#include<queue>
#include<unistd.h>
#include <semaphore.h>
using namespace std;
class Sem
{
public:
    Sem(int num)
    {
        sem_init(&_sem,0,num);
    }
    ~Sem()
	{
		sem_destroy(&_sem);
	}
    void V()
    {
        sem_post(&_sem);
    }
    void P()
    {
        sem_wait(&_sem);
    }
private:
    sem_t _sem;
};

Task.hpp(封装任务队列):

cpp 复制代码
#include "sem.hpp"
#include <iostream>
#include <queue>
#include <pthread.h>
using namespace std;

int num = 10;

class Task
{
public:
    Task(): _space(num), _data(0)
    {
        pthread_mutex_init(&_mtx, nullptr);
    }

    void Push(int x)
    {
        _space.P();  // 生产者等待空间
        pthread_mutex_lock(&_mtx);
        q.push(x);
        cout << "生产了:" << x << endl;
        pthread_mutex_unlock(&_mtx);
        _data.V();   // 通知消费者数据已生产
    }

    void Pop()
    {
        _data.P();   // 消费者等待数据
        pthread_mutex_lock(&_mtx);
        cout << "消费了:" << q.front() << endl;
        q.pop();
        pthread_mutex_unlock(&_mtx);
        _space.V();  // 通知生产者空间已释放
    }

private:
    Sem _space;    // 空闲空间数量
    Sem _data;     // 数据数量
    pthread_mutex_t _mtx;
    queue<int> q;
};

.cc:

cpp 复制代码
#include"Task.hpp"
void* consumer(void* args)
{
    Task* t = (Task*)args;
    while(1)
    {
        sleep(1);
        t->Pop();
    }
    return nullptr;
}
void* producer(void* args)
{
    Task* t = (Task*)args;
    while(1)
    {
        t->Push(rand()%1000);
    }
    return nullptr;
}
int main()
{
    srand(time(nullptr));
    Task* t = new Task;
    pthread_t Consumer[5];
    pthread_t Producer[5];
    for(int i = 0; i < 5; i++)
    {
        pthread_create(&Consumer[i], nullptr, consumer, (void*)t);
        pthread_create(&Producer[i], nullptr, producer, (void*)t);
    }
    for(int i = 0; i < 3; i++)
    {
        pthread_join(Consumer[i], nullptr);
        pthread_join(Producer[i], nullptr);
    }
    delete t;
    return 0;
}   
相关推荐
带鱼吃猫5 分钟前
Linux 守护进程:会话、终端与后台运行的底层逻辑
linux·运维·服务器
wdfk_prog8 分钟前
[Linux]学习笔记系列 -- [fs]iomap
linux·笔记·学习
两拆9 分钟前
Linux(redhat7.9)安装KVM虚拟机
linux
Alex Cafu10 分钟前
Linux网络编程2(HTTP 协议、IO 多路复用)
linux·c语言·网络·http
yBmZlQzJ19 分钟前
第二篇:Linux服务器性能优化实战技巧(提升稳定性与效率)
linux·服务器·性能优化
QT 小鲜肉20 分钟前
【Linux命令大全】001.文件管理之mlabel命令(实操篇)
linux·运维·服务器·前端·笔记
知识分享小能手26 分钟前
Ubuntu入门学习教程,从入门到精通, Ubuntu 22.04 的磁盘存储管理(10)
linux·学习·ubuntu
大聪明-PLUS26 分钟前
Linux 网络虚拟化技术的演进
linux·嵌入式·arm·smarc
半桔27 分钟前
【高并发架构】从 0 到亿,从单机部署到 K8s 编排:高并发架构的 8 级演进之路
linux·云原生·容器·架构·kubernetes
脏脏a32 分钟前
【Linux】从 fork 到进程终止:写时拷贝细节与常见退出方式
linux·运维·服务器·进程终止