`
icarusliu
  • 浏览: 238079 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

生产者与消费者C语言版

 
阅读更多

#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#include <windows.h>

#include "base.h"

typedef struct
{
	HANDLE sem;//账号信号量
	int count;//账号余额
}Account;

HANDLE threads[2];//第一个是inThread,第二个是outThread

unsigned long inThrId;
unsigned long outThrId;

void *inThreadEntry(void *param);
void *outThreadEntry(void *param);

BOOL startInThread(Account *account);
BOOL startOutThread(Account *account);

BOOL instore(Account *account,int count);
BOOL outstore(Account *account, int count);

void initAccount(Account *account);
void destroyAccount(Account *account);

void main(void)
{
	Account *account = (Account *)malloc(sizeof(Account));
	if (NULL == account)
	{
		printf("ERROR: Malloc for account failed!\n");
		return;
	}

	initAccount(account);
	
	if (BOOL_TRUE == startInThread(account))
	{
		if (BOOL_TRUE != startOutThread(account))
		{
			destroyAccount(account);
			CloseHandle(threads[0]);
		}
	}
	else
	{
		destroyAccount(account);
	}

	WaitForMultipleObjects(2,threads,TRUE,INFINITE);

	CloseHandle(threads[0]);
	CloseHandle(threads[1]);
	destroyAccount(account);
}

void *inThreadEntry(void *param)
{
	while (1)
	{
		instore((Account *)param,1);
		Sleep(1000);
	}

	return NULL;
}

void *outThreadEntry(void *param)
{
	while (1)
	{
		outstore((Account *)param,5);
		Sleep(1000);
	}

	return NULL;
}

BOOL startInThread(Account *account)
{
	threads[0] = (HANDLE)_beginthreadex(NULL,0,(unsigned int(_stdcall *)(void *))inThreadEntry,account,0,&inThrId);
	if (NULL == threads[0])
	{
		printf("ERROR: Create in thread failed!\n");
		return BOOL_FALSE;
	}
	else
	{
		printf("INFO: Create in thread succeed!\n");
		return BOOL_TRUE;
	}
}

BOOL startOutThread(Account *account)
{
	threads[1] = (HANDLE)_beginthreadex(NULL,0,(unsigned int(_stdcall *)(void *))outThreadEntry,account,0,&outThrId);
	if (NULL == threads[1])
	{
		printf("ERROR: Create out thread failed!\n");
		return BOOL_FALSE;
	}
	else
	{
		printf("INFO: Create out thread succeed!\n");
		return BOOL_TRUE;
	}
}

BOOL instore(Account *account,int count)
{
	if (account == NULL)
	{
		printf("ERROR: the account is not initated!\n");
		return BOOL_FALSE;
	}
	
	WaitForSingleObject(account->sem,INFINITE);
	account->count = account->count + count;
	printf("INFO: Store %d into this account!\n",count);
	printf("INFO: After sotre, the count is %d!\n",account->count);
	ReleaseSemaphore(account->sem,1,NULL);

	return BOOL_TRUE;
}

BOOL outstore(Account *account, int count)
{
	int nowCount;

	if (NULL == account)
	{
		printf("ERROR: Please first init the account!\n");
		return BOOL_FALSE;
	}

	WaitForSingleObject(account->sem,INFINITE);
	nowCount = account->count;
	if (nowCount < count)
	{
		ReleaseSemaphore(account->sem,1,NULL);
		printf("ERROR: The account is not enough,Waiting...!\n");
		Sleep(500);
		return outstore(account,count);
	}
	
	account->count = account->count - count;
	printf("INFO: Get %d from account succeed!\n",count);
	printf("INFO: After outstore: %d!\n",account->count);
	ReleaseSemaphore(account->sem,1,NULL);

	return BOOL_TRUE;
}

void initAccount(Account *account)
{
	memset(account,0x00,sizeof(Account));
	account->sem = CreateSemaphore(NULL,1,1,(LPCWSTR)"Semaphore for account!");
	account->count = 0;
}

void destroyAccount(Account *account)
{
	if (NULL == account)
	{
		return;
	}

	CloseHandle(account->sem);

	memset(account,0x00,sizeof(Account));
	free(account);
	account = NULL;
}

 执行结果:


  • 大小: 38.3 KB
分享到:
评论

相关推荐

    C语言实现生产者消费者问题

    C语言实现生产者消费者问题,分配具有n个缓冲区的缓冲池,作为共享资源。 定义两个资源型信号量empty 和full,empty信号量表示当前空的缓冲区数量,full表示当前满的缓冲区数量。 定义互斥信号量mutex,当某个进程...

    生产者——消费者 c语言

    为了在多线程环境下正确实现生产者-消费者问题,可以使用以下C语言库提供的工具: 1. **pthread库**:提供线程创建和同步原语,如`pthread_create`、`pthread_mutex_lock`、`pthread_mutex_unlock`和`pthread_cond_...

    C语言编程模拟生产者和消费者问题.pdf

    "C语言编程模拟生产者和消费者问题" 本文档主要介绍了使用C语言编程来模拟生产者和消费者问题的解决方案。生产者和消费者问题是操作系统中的一种经典问题,它们之间的同步是通过使用PV操作来实现的。PV操作由P操作...

    操作系统-生产者与消费者问题的C语言实现

    1.模拟用信号量机制实现生产者和消费者问题。 2.设计报告内容应说明: ⑴ 课程设计目的与功能; ⑵ 需求分析,数据结构或模块说明(功能与框图); ⑶ 源程序的主要部分; ⑷ 运行结果与运行情况分析; ⑸ 自我评价...

    生产者消费者问题C语言

    生产者消费者问题C语言 生产者消费者问题是计算机科学中的一种经典问题,用于描述多线程环境下的生产和消费关系。在该问题中,存在一个生产者和一个消费者,生产者将数据放入缓冲区中,而消费者从缓冲区中取出数据...

    LinuxC语言实现生产者和消费者模型

    LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC...

    C语言实现操作系统中生产者消费者

    用C-Free5软件写的,主函数为Int类型。在其他软件上可能要改成void,算法方面没有什么问题。如果要缓冲池满就把生产者M1的数改的比消费者M2的高,要缓冲池空则相反。

    用C语言模拟生产者消费者问题

    以下是一个简化的生产者消费者问题的C语言实现框架: ```c #include #include #include #define BUFFER_SIZE 10 int buffer[BUFFER_SIZE]; int count = 0; sem_t empty, full; void producer() { // 生产逻辑...

    生产者消费者程序的实现

    生产者消费者的实现。可以自主地改变生产者,消费者的数目,和缓冲区。

    c语言生产者消费者问题

    本文档是大学本科课程嵌入式系统课程作业,代码在实验报告里面,c语言实现的生产者消费者问题,使用信号量编程,semaphore,运行环境是Linux ubantu,希望对大家有帮助

    利用数组解决生产者消费者问题

    生产者消费者问题是多线程编程中的经典模型,用于模拟两个或多个并发执行的实体(生产者和消费者)共享有限资源的情况。在这个问题中,生产者负责生成数据并放入缓冲区,而消费者则从缓冲区取出数据进行处理。当缓冲...

    生产着与消费者者 c语言

    根据给定的信息,本文将详细解释“生产者与消费者模型”在C语言中的实现方法,同时解析代码的具体功能以及如何通过信号量(semaphores)来实现进程间的同步。 ### 生产者与消费者模型 生产者与消费者模型是计算机...

    pv操作解决生产者与消费者问题

    此外,pv操作还可以广泛应用于各种生产者消费者问题的解决中,使得系统更为可靠和高效。 pv操作是解决生产者与消费者问题的常用方法之一。通过pv操作,我们可以确保生产者进程和消费者进程之间的同步,避免数据的...

    使用多线程程序模拟实现单生产者/多消费者问题(Linux下C语言)。

    使用多线程程序模拟实现单生产者/多消费者问题。 要求“生产者”随机产生一个整数,“消费者 1”将这个整数加 1 后输出,“消 费者 2”将这个整数加 2 后输出,“消费者 3”将这个整数加 3 后输出,“消 费者 4”将...

    Linux环境下C语言实现生产者消费者问题的代码

    在Linux下完整C语言实现生产者消费者问题的代码。其中涉及信号量、多线程、GCC编译、PV操作等基础知识。Linux下通过gcc - o yy xxx.c -pthread,再通过./yy即可运行。

    以记录型信号量实现生产者-消费者问题

    利用C语言程序模拟生产者-消费者问题和哲学家进餐问题。 实验设备及环境: Pc机一台,vc6.0 for windows 实验步骤: 1.以记录型信号量实现生产者-消费者问题; 2.利用AND信号量解决生产者-消费者问题; 3.利用记录...

    Linux c语言多线程实现生产者/消费者问题

    一组生产者线程与一组消费者线程通过缓冲区发生联系。生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。缓冲区有N 个,是一个环形的缓冲池。 使用命令cc consumer.c -o consumer编译

    生产者和消费者模式多线程

    创建一个简单的生产者消费者模型,可以使用以下伪代码: ```java class Producer implements Runnable { private final BlockingQueue&lt;String&gt; queue; public Producer(BlockingQueue&lt;String&gt; queue) { this....

    生产者消费者问题 进程实现

    在给定的程序中,作者使用了C语言和POSIX信号量来实现生产者消费者问题。程序中定义了一个共享结构体`shared_t`,其中包含了缓冲区、锁、可用信号量和空闲信号量等成员变量。生产者和消费者进程之间通过这些信号量来...

    生产者与消费者进程问题 实验报告

    实验目的和要求 目的 1.掌握基本的同步和互斥的算法; 2.掌握生产者和消费者的原理。 要求 用c语言编程搭建“生产者和消费者”经典进程问题的环境。

Global site tag (gtag.js) - Google Analytics