首页 > 其他分享 >生产者-消费者代码实现

生产者-消费者代码实现

时间:2023-11-21 11:44:06浏览次数:28  
标签:Task 消费者 生产者 代码 ptask tasks taskID include void

#include <pthread.h>
#include <errno.h>
#include <list>
#include <iostream>
#include <semaphore.h>
#include <unistd.h>




class Task
{
public:
    Task(int taskID){
        this->taskID = taskID;
    }

    void doTask()
    {
        std::cout << "handle a task, taskID: " << taskID << ", threadID: " << pthread_self() << std::endl;
    }

private:
    int taskID;

};

pthread_mutex_t mymutex;
std::list<Task*> tasks;
sem_t mysemaphore;

void* consumer_thread(void* param)
{
    Task* ptask = NULL;

    while(true){
        if(sem_wait(&mysemaphore) != 0) continue;

        if(tasks.empty()) continue;

        pthread_mutex_lock(&mymutex);
        ptask = tasks.front();
        tasks.pop_front();
        pthread_mutex_unlock(&mymutex);

        ptask->doTask();
        delete ptask;
    }
    return NULL;
}

void* producer_thread(void* param)
{
    int taskID = 0;
    Task* pTask = NULL;
    while(true){
        pTask = new Task(taskID);

        pthread_mutex_lock(&mymutex);
        tasks.push_back(pTask);
        std::cout << "produce a task, taskID: " << taskID << ", threadID: " << pthread_self() << std::endl;
        pthread_mutex_unlock(&mymutex);

        sem_post(&mysemaphore);
        taskID++;

        sleep(1);
    }
    return NULL;

}




int main()
{
    pthread_mutex_init(&mymutex,NULL);
    //初始化信号量资源计数为0
    sem_init(&mysemaphore,0,0);

    //创建5个消费者线程
    pthread_t consumerThreadID[5];
    for(int i = 0; i < 5; i++){
        pthread_create(&consumerThreadID[i],NULL,consumer_thread,NULL);
    }

    //创建一个生产者线程
    pthread_t producerThreadID;
    pthread_create(&producerThreadID,NULL,producer_thread,NULL);

    pthread_join(producerThreadID,NULL);

    for(int i = 0; i < 5; ++i){
        pthread_join(consumerThreadID[i],NULL);
    }

    sem_destroy(&mysemaphore);
    pthread_mutex_destroy(&mymutex);

    return 0;
}

标签:Task,消费者,生产者,代码,ptask,tasks,taskID,include,void
From: https://www.cnblogs.com/ljx-0122/p/17846275.html

相关文章

  • 【HarmonyOS】低代码平台组件拖拽使用技巧之页签容器
    ​【关键字】HarmonyOS、低代码平台、Tabs、TabContent、页签导航 1、写在前面前面几篇分别介绍了低代码平台中的堆叠容器、滚动容器、网格布局等三种容器的使用,实际开发中我们经常会有这样的需求,页面底部是三个Tab按钮点击时会分别切换不同的视图内容,本篇我们就来介绍低代码......
  • 【HarmonyOS】低代码平台组件拖拽使用技巧之列表
    ​【关键字】HarmonyOS、低代码平台、组件拖拽、列表、列表项 1、写在前面我们在日常开发中使用最多的组件可能就是列表组件了,现在几乎所有的应用都离不开列表,那么今天我们就来介绍一下如何利用低代码平台来实现列表的展示,列表实际上也是容器的一种,需要注意的是,列表是需要结......
  • 【HarmonyOS】低代码平台组件拖拽使用技巧之常用基础组件(上)
    ​【关键字】HarmonyOS、低代码平台、组件拖拽、常用基础组件、基础容器 1、写在前面之前是花了一些时间介绍了在低代码平台中滚动容器、网格布局、页签容器、列表这几种容器的拖拽技巧及使用方法,今天我会继续来介绍咱们在应用开发中可能会经常用到的一些基础容器和基础组件,......
  • php提前返回数据,后面代码继续执行封装函数
    /*中断并返回数据,后面程序继续执行,避免用户等待(immediate)*可用于返回值后,继续执行程序,但程序占得所以自由没有释放,一致占用,务必注意,最好给单独脚本执行*@paramstring|array$data字符串或数组,数组将被转换成json字符串*@paramintval$set_ti......
  • Net 高级调试之十:轻量级代码生成的调试
    一、简介今天是《Net高级调试》的第十篇文章。说起来,高级调试,调试的内容还是挺多的,技巧也不少,但是,要想做一个合格的高级调试人员,还需要掌握如何调试动态生成的IL代码。今天要探讨的高级调试的技巧是如何调试通过Emit动态生成IL代码。可能有人会问,我们不是编写C#代......
  • 2023版 STM32实战3 按键外部中断(电路与代码都讲解)
    常规电路(带上拉电阻)阻值可选3.3/4.7/5.1/10单位K  偷懒电路利用GPIO内部的上拉模式 代码(直接拷贝使用)这是一个外部中断控制变量a增加减少的demo为了新手方便我直接都写在了main.c文件 #include"stm32f10x.h"u8keyflag=0;u8a=0;voidKEY_Init(void){......
  • 【Azure Key Vault】.NET 代码如何访问中国区的Key Vault中的机密信息(Get/Set Secret
    问题描述使用.NETAzure.Identity中的 DefaultAzureCredential 认证并连接到AzureKeyVault中,在KeyVault的示例中,并没有介绍如何在代码中设置连接到中国区Azure中。如果直接运行DefaultAzureCredential,会默认连接到GlobalAzure,那需要如何修改才能连接到ChinaAzure中呢? ......
  • VUE框架实现原理及代码构成结构详解------前端
    VUE框架实现原理及代码构成结构详解------VUE框架<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title&......
  • 【Azure Key Vault】.NET 代码如何访问中国区的Key Vault中的机密信息(Get/Set Secret
    问题描述使用.NETAzure.Identity中的 DefaultAzureCredential认证并连接到AzureKeyVault中,在KeyVault的示例中,并没有介绍如何在代码中设置连接到中国区Azure中。如果直接运行DefaultAzureCredential,会默认连接到GlobalAzure,那需要如何修改才能连接到ChinaAzure中呢......
  • JetBrains TeamCity 任意代码执行漏洞(CVE-2023-42793)研究
    一、JetBrainsTeamCity简介TeamCity是一款由JetBrains开发的强大的持续集成(ContinuousIntegration,CI)和持续部署(ContinuousDeployment,CD)工具。它帮助开发团队自动化构建、测试和部署过程,以确保软件项目的质量和快速交付。TeamCity的主要特点和优势包括:灵活的构建配......