`
com_xpp
  • 浏览: 355184 次
社区版块
存档分类
最新评论

并发控制-生产者-消费者问题

 
阅读更多

/*
生产者与消费者问题的实现。
创建一组“生产者”线程和一组“消费者”线程,并建立一个长度为N的缓冲池。
“生产者”向缓冲区输入数据,“消费者”从缓冲区读出数据。
当缓冲区满时,“生产者”必须阻塞,等待“消费者”取走缓冲区数据后将其唤醒。
当缓冲区空时,“消费者”阻塞,等待“生产者”生产了产品后将其唤醒。
用信号量实现“生产者”与“消费者”线程之间的同步。

*/
#include <windows.h>
#include <iostream>
#include<cstdio>


const int PCOUNT = 5; //生产者的个数
const int CCOUNT = 5; //消费者的个数
const int N = 8; //缓冲池中缓冲区数量
int ProductID = 0; //生产产品号
int ConsumeID = 0; //消费产品号
int in = 0;
int out = 0;
int total = 0; //库存量
int Buffer[N]; //缓冲池
int buffer[N];
bool stop = false;
HANDLE Mutex; //互斥信号量实现缓冲池的互斥使用
HANDLE Full; //缓冲池中满缓冲区的数量
HANDLE Empty; //缓冲池中空缓冲区的数量

SYSTEMTIME systime;

DWORD WINAPI Producer(LPVOID); //生产者线程
DWORD WINAPI Consumer(LPVOID); //消费者线程

int main()
{
//创建各个互斥信号
Mutex = CreateMutex(NULL,FALSE,NULL);
Full = CreateSemaphore(NULL,N-1,N-1,NULL);
Empty = CreateSemaphore(NULL,0,N-1,NULL);
//创建互斥信号量失败
if (Mutex == NULL)
{
printf("CreateMutex error: %d\n", GetLastError());
return 0;
}
//创建Full信号量失败
if (Full == NULL)
{
printf("CreateSemaphoreFull error: %d\n", GetLastError());
return 0;
}
//创建Empty信号量失败
if (Empty == NULL)
{
printf("CreateSemaphoreEmpty error: %d\n", GetLastError());
return 0;
}

HANDLE ProducerThreads[PCOUNT]; //生产者线程
HANDLE ConsumerThreads[CCOUNT]; //消费者线程
DWORD producerID[PCOUNT]; //生产者线程的标识符
DWORD consumerID[CCOUNT]; //消费者线程的标识符

//创建生产者线程
for (int i=0;i<PCOUNT;++i)
{
ProducerThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&producerID[i]);
if(ProducerThreads[i] == NULL )
{
printf("CreateThread error: %d\n", GetLastError());
return 0;
}
}
//创建消费者线程
for (i=0;i<CCOUNT;++i)
{
ConsumerThreads[i]=CreateThread(NULL,0,Consumer,NULL,0,&consumerID[i]);
if( ConsumerThreads[i] == NULL)
{
printf("CreateThread error: %d\n", GetLastError());
return 0;
}
}

while(!stop)
{
if(getchar())//按回车后终止程序运行
{
stop = true;
}
}
return 0;
}

//生产
void Produce()
{
printf("生产第%d个产品并加入库存中\n",++ProductID );
Buffer[in] = 1;
in = (in+1)%N;
//输出缓冲区当前的状态
printf("缓冲区当前的状态:");
for (int i=0;i<N;++i)
{
printf("%d",Buffer[i]);
}
printf("\n");
printf("生产者ID:%d\n",GetCurrentThreadId());
buffer[in-1] = GetCurrentThreadId();
printf("产品ID:%d\t\t缓冲区ID:%d\n",ProductID,in);
GetLocalTime(&systime);
printf("时间:%02d:%02d:%02d\t\t", systime.wHour, systime.wMinute, systime.wSecond);
printf("当前库存量:%d\n",++total);
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
}

//消费
void Consume()
{
printf("消费第%d个产品并从库存拿出\n",++ConsumeID);
Buffer[out] = 0;
out = (out+1)%N;
//输出缓冲区当前的状态
printf("缓冲区当前的状态:");
for (int i=0;i<N;++i)
{
printf("%d",Buffer[i]);
}
printf("\n");
printf("消费者ID:%d\n",GetCurrentThreadId());
printf("产品ID:%d\t\t缓冲区ID:%d\t\t来自生产者ID:%d\n",ConsumeID,out,buffer[out-1]);
GetLocalTime(&systime);
printf("时间:%02d:%02d:%02d\t\t", systime.wHour, systime.wMinute, systime.wSecond);
printf("当前库存量:%d\n",--total);
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
}


//生产者
DWORD WINAPI Producer(LPVOID lpPara)
{
while(!stop)
{
WaitForSingleObject(Full,INFINITE);
WaitForSingleObject(Mutex,INFINITE);
Produce();
Sleep(1000);
ReleaseMutex(Mutex);
ReleaseSemaphore(Empty,1,NULL);
}
return 0;
}

//消费者
DWORD WINAPI Consumer(LPVOID lpPara)
{
while(!stop)
{
WaitForSingleObject(Empty,INFINITE);
WaitForSingleObject(Mutex,INFINITE);
Consume();
Sleep(1000);
ReleaseMutex(Mutex);
ReleaseSemaphore(Full,1,NULL);
}
return 0;
}

分享到:
评论

相关推荐

    并发控制-生产者-消费者问题实验报告

    并发控制-生产者-消费者问题实验报告

    用多进程同步方法演示“生产者-消费者”问题

    1、设计目的:通过研究Linux的进程机制和信号量,实现生产者消费者问题的并发控制。 2、说明:有界缓冲区内设有20个存储单元,放入取出的产品设定为1-20个整数。 3、设计要求: 生产者和消费者进程的数目不固定,可...

    生产者-消费者问题的模拟实现(课设含源代码).doc

    通过研究进程并发和信号量机制,实现生产者-消费者问题的并发控制。 2、设计要求 1)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者进程的标识符。 说明:...

    操作系统课设用多进程同步方法演示“生产者-消费者”问题

    1、设计目的:通过研究Linux的进程同步机制和信号量,实现生产者消费者问题的并发控制。 2、说明:有界缓冲区内设有20个存储单元,放入取出的产品设定为20个100以内的随机整数。 3、设计要求: 1) 生产者与消费者均...

    编程模拟实现生产者-消费者进程

    生产者-消费者问题描述的是:有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程与消费者进程能够并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程将它所生产的产品...

    操作系统课程设计——生产者消费者问题Java图形界面动态演示

    设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20 个存储单元,放入/取出的数据项设定为1‐20 这20 个整型数。设计要求:1)每个生产者和消费者对有界缓冲区...

    实现生成者消费者问题

    通过研究Linux的线程机制和信号量实现生产者消费者(Bounded Buffer)问题的并发控制。 实验条件要求:每人一台与Linux主机联网的Windows主机,普通用户权限。 (1) 每个生产者和消费者对有界缓冲区进行操作后,...

    线程并发控制condition互斥量 多线程写的:生产者、消费者问题

    线程并发控制condition 互斥量 多线程写的:生产者、消费者问题

    操作系统课程设计生产者和消费者问题源代码

    本实验在为生产者分配缓冲区时各生产者间必须互斥,此后各个生产者的具体生产活动可以并发。而消费者之间只有在对同一产品进行消费时才需要互斥,同时它们在消费过程结束时需要判断该消费对象是否已经消费完毕并...

    用多线程同步方法演示“生产者-消费者”问题

    1、设计目的:通过研究Linux的进程同步机制和信号量,实现生产者消费者问题的并发控制。 2、说明:有界缓冲区内设有26个存储单元,放入取出的产品设定为26个大写英文字母。 3、设计要求: 1) 生产者与消费者均有二个...

    生产者消费者问题java的java编写的

    设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制. 说明:有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1-20这20个整型数. 设计要求:(1)每个生产者和消费者对有界缓冲区进行操作后...

    计算机操作系统课程设计报告《生产者---消费者问题》.doc

    课程设计任务及要求 2.1 设计任务 通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制. 说明:有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1- 20这20个整型数。 2.2 设计要求 (1)每个生产...

    操作系统 课程设计 实现生产者消费者(Bounded – Buffer Problem)问题

    通过研究Linux的线程机制和信号量实现生产者消费者(Bounded Buffer)问题的并发控制。 实验条件要求:每人一台与Linux主机联网的Windows主机,普通用户权限。 (1) 每个生产者和消费者对有界缓冲区进行操作后,即时...

    生产者和消费者问题程序

    (1)掌握基本的同步互斥算法,理解生产者和消费者同步的问题模型。 (2)了解Windows 2000/XP中多线程的并发执行机制,线程间的同步和互斥。 (3)学习使用Windows2000/XP中基本的同步对象,掌握相应的API。 2、...

    利用管程_信号量解决生产者消费者问题

    本设计通过模拟计算机操作系统中经典的“生产者—消费者问题”,巩固在操作系统原理课上所学的知识,加深对操作系统中进程同步和互斥、临界区管理,管程等问题的认识和理解。前期主要利用P、V信号量来控制各进程间的...

    生产者消费者问题JAVA实现代码

    os课程设计、通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制

    生产者消费者_操作系统设计

    本课程设计通过模拟计算机操作系统中经典的“生产者—消费者问题”,巩固在操作系统原理课上所学的知识,加深对操作系统中进程同步和互斥、临界区管理,管程等问题的认识和理解。前期主要利用P、V信号量来控制各进程...

    生产者与消费者实验报告.docx

    了解经典同步问题"生产者和消费者" 生产者与消费者可以通过一个环形缓冲池联系起来,环形缓冲池由几个大小相等的缓冲块组成,每个缓冲块容纳一个产品。每个生产者可不断地每次往缓冲池中送一个生产产品,而每个消费...

    生产者消费者问题解决

    设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制. 说明:有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1-20这20个整型数.

Global site tag (gtag.js) - Google Analytics