当前位置: 首页 > article >正文

Linux信号量(简易版)

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

#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(封装任务队列):

#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:

#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;
}   


http://www.kler.cn/a/271429.html

相关文章:

  • 【游戏设计原理】96 - 成就感
  • LeetCode:343. 整数拆分
  • Spring RESTful API 设计与实现
  • 51单片机CLD1602显示万年历+闹钟+农历+整点报时
  • 智慧园区系统助力企业智能化升级实现管理效率与安全性全方位提升
  • 《大语言模型》综述学习笔记
  • C#编程语言在软件开发中的深度应用与实践
  • android studio 连接mumu模拟器调试
  • StarRocks 易用性全面提升:数据导入可以如此简单
  • 研究生总结
  • <Linux> 线程的同步与互斥
  • Java8中Stream流API最佳实践Lambda表达式使用示例
  • macOS上基于httpd-dav搭建WebDav服务
  • RabbitMq——direct交换器、fanout交换器、 topic交换器
  • wayland(xdg_wm_base) + egl + opengles 渲染使用纹理贴图的旋转 3D 立方体实例(十三)
  • 【NLP笔记】文本分词、清洗和标准化
  • 【学习学习】学习金字塔
  • 前端小白的学习之路(HTML5 二)
  • Fork - 将 GitHub 的某个特定仓库复制到自己的账户下
  • 【数据可视化】使用Python + Gephi,构建中医方剂关系网络图!
  • Acwing.1343 挤牛奶(区间合并or差分)
  • 爬虫基本原理介绍、实现以及问题解决
  • html编辑器
  • 分布式链路追踪(一)SkyWalking(2)使用
  • 橡胶工厂5G智能制造数字孪生可视化平台,推进橡胶工业数字化转型
  • 数据结构与算法----复习Part 16 (并查集)