• 大小: 5KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-06-06
  • 语言: C/C++
  • 标签:

资源简介

假设M个生产者和N个消费者共享一个具有K(K大于1)个缓冲区的循环缓冲结构BUFFER(提示:可以用一个循环队列或一个整型数组来表示),并设置两个指针IN和OUT,其中IN指向生产者线程当前可用的空缓冲区的在BUFFER中的下标,OUT指向消费者线程当前可用的满缓冲区在BUFFER中的下标。生产者线程和消费者线程并发执行,当无空缓冲区时,生产者线程阻塞;当无满缓冲区时消费者线程阻塞,并且多个生产者线程对IN的使用必须互斥,多个消费者线程对OUT的使用也必须互斥

资源截图

代码片段和文件信息

#include “stdafx.h“
#include   
#include 
#include 
#include 
using namespace std;

//设置控制台输出颜色
BOOL SetConsoleColor(WORD wAttributes)
{
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    if (hConsole == INVALID_HANDLE_VALUE)
        return FALSE;
    return SetConsoleTextAttribute(hConsole wAttributes);
}

int MNK; //生产者,消费者,缓冲区的个数
int ProductID;//生产产品ID
int ConsumeID;//消费产品ID
int *g_Buffer; //缓冲池
int g_i g_j;  //缓冲池里的生产者和消费者的指向

HANDLE Pro_MutexCon_MutexMutex; 
HANDLE Empty Full;
SYSTEMTIME systime;

struct ThreadInfo
{
int ID; //ID
int delay;
};
ThreadInfo *Thread_info;
void ProducerThreadFun(void *p)
{
    while(true)
    {
DWORD m_delay; 
m_delay = (DWORD)( ((ThreadInfo*)(p))->delay);
Sleep(m_delay*1000);
WaitForSingleobject(EmptyINFINITE);
        WaitForSingleobject(Pro_MutexINFINITE);
WaitForSingleobject(MutexINFINITE);
int ID;ID = ((ThreadInfo*)(p))->ID;
static int nextp = 0;
nextp = rand()%100;
        g_Buffer[g_i] = nextp;
SetConsoleColor(FOREGROUND_RED);
cout<<“*******现在执行生产者进程*******“< cout<        cout<<“   生产者ID = “< cout<<“   投入进缓冲区(缓冲区位置 “< cout< cout<<“   产品ID = “< cout<<“   当前阻塞生产者进程ID为 “;
for(int i = 0; i < M; i++)
{
if(i+1 != ID)
cout< }
cout<
GetLocalTime(&systime);
cout<<“   当前时间“< cout< cout<<“--------------------------------------------------------“< SetConsoleColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
ProductID++;
        g_i = (g_i + 1) % K;
Sleep(2000);
ReleaseMutex(Mutex);
        ReleaseMutex(Pro_Mutex);
        ReleaseSemaphore(Full1NULL);
    }
    printf(“生产者完成任务,线程结束运行\n“);
}
void ConsumerThreadFun(void *p)  
{
    while(true)
{
static int nextc = 0;
DWORD m_delay;
m_delay = (DWORD)( ((ThreadInfo*)(p))->delay);
Sleep(m_delay*1000);
        WaitForSingleobject(Full INFINITE);
        WaitForSingleobject(Con_MutexINFINITE);
WaitForSingleobject(MutexINFINITE);
int ID;ID = ((ThreadInfo*)(p))->ID;
nextc = g_Buffer[g_j];
        SetConsoleColor(FOREGROUND_GREEN);
cout<<“*******现在执行消费者进程*******“< cout<        c

评论

共有 条评论