多线程实现生产消费者模型(含代码)

实验题目:多线程实现生产消费者模型(程序可在Linux下和VS2019中运行)
实验要求:1.生产者4个,消费者8个,仓库容量20个,初始为10个。
---------------2.生产者和消费者生产消费完毕后需要休眠一段时间。
---------------3.货物为随机产生的大写字母。
实验环境:1.windows11、visual studio 2019 X86
---------------2.Linux、ubuntu20、gcc7.4.0、secureCRT4.0、notepad++
参考内容: 无法打开pthread.h
注意:1. pthread的下载链接为:
https://sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.zip
-------- 2.请注意 参考内容 “无法打开pthread.h” 内的2.3 dll文件内x86 下的文件复制到C:\Windows\SysWOW64

一、使用条件变量和互斥锁

1.原理

在这里插入图片描述
从上图中可以看出在不满足条件下,消费者线程会进入触发pthread_cond_wait(&g_cond,&g_mutex),然后该消费者线程被进入条件队列,并释放锁(该锁由条件变量释放);这时生产者抢到锁,生产,释放信号量,解锁;当条件队列当中的等待的消费者线程接收到该信号后,上锁(紧接着pthread_cond_wait()后进行,上锁由条件变量进行),消费,解锁。这样就完成了一个条件变量和互斥锁的相互使用。

2.程序

/*!
*************************************************************************************************
* @file  main.cpp
* @brief producer consumer model Production consumption model
* @author Super Pallet-Town Man
* date 2022/9/10
*************************************************************************************************
*/
// Windows system
#include <windows.h>

//Linux use
//#include <unistd.h>

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>

#define CONSUMERS_NEMBER 4
#define PRODUCERS_NEMBER 2
#define MAX_BUDDER_SIZE 20
#define INIT_BUFFER_SIZE 10

pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t g_cond = PTHREAD_COND_INITIALIZER;
pthread_t g_threadConsumers[CONSUMERS_NEMBER];
pthread_t g_threadProducers[PRODUCERS_NEMBER];

typedef struct _ST_BUF
{
   
    int iCount;
    char strArray[MAX_BUDDER_SIZE + 1];
}ST_BUF;
static ST_BUF stBuf = {
    INIT_BUFFER_SIZE , {
   0}};

/*!
 * @brief generate random letters
 *
 * @return letter
 */
char getRandLetter()
{
   
    char letter;
    letter = (char)((rand() % 26) + 'A');
    return letter;
}

/*!
 * @brief consumer model function
 * 
 * @param[in] arg the serial number
 * 
 * @return NULL to end
 */
void* consumer(void* arg)
{
   
    if (NULL == arg)
    {
   
        exit(-1)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值