#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语言实现生产者消费者问题,分配具有n个缓冲区的缓冲池,作为共享资源。 定义两个资源型信号量empty 和full,empty信号量表示当前空的缓冲区数量,full表示当前满的缓冲区数量。 定义互斥信号量mutex,当某个进程...
为了在多线程环境下正确实现生产者-消费者问题,可以使用以下C语言库提供的工具: 1. **pthread库**:提供线程创建和同步原语,如`pthread_create`、`pthread_mutex_lock`、`pthread_mutex_unlock`和`pthread_cond_...
"C语言编程模拟生产者和消费者问题" 本文档主要介绍了使用C语言编程来模拟生产者和消费者问题的解决方案。生产者和消费者问题是操作系统中的一种经典问题,它们之间的同步是通过使用PV操作来实现的。PV操作由P操作...
1.模拟用信号量机制实现生产者和消费者问题。 2.设计报告内容应说明: ⑴ 课程设计目的与功能; ⑵ 需求分析,数据结构或模块说明(功能与框图); ⑶ 源程序的主要部分; ⑷ 运行结果与运行情况分析; ⑸ 自我评价...
生产者消费者问题C语言 生产者消费者问题是计算机科学中的一种经典问题,用于描述多线程环境下的生产和消费关系。在该问题中,存在一个生产者和一个消费者,生产者将数据放入缓冲区中,而消费者从缓冲区中取出数据...
LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC...
用C-Free5软件写的,主函数为Int类型。在其他软件上可能要改成void,算法方面没有什么问题。如果要缓冲池满就把生产者M1的数改的比消费者M2的高,要缓冲池空则相反。
以下是一个简化的生产者消费者问题的C语言实现框架: ```c #include #include #include #define BUFFER_SIZE 10 int buffer[BUFFER_SIZE]; int count = 0; sem_t empty, full; void producer() { // 生产逻辑...
生产者消费者的实现。可以自主地改变生产者,消费者的数目,和缓冲区。
本文档是大学本科课程嵌入式系统课程作业,代码在实验报告里面,c语言实现的生产者消费者问题,使用信号量编程,semaphore,运行环境是Linux ubantu,希望对大家有帮助
生产者消费者问题是多线程编程中的经典模型,用于模拟两个或多个并发执行的实体(生产者和消费者)共享有限资源的情况。在这个问题中,生产者负责生成数据并放入缓冲区,而消费者则从缓冲区取出数据进行处理。当缓冲...
根据给定的信息,本文将详细解释“生产者与消费者模型”在C语言中的实现方法,同时解析代码的具体功能以及如何通过信号量(semaphores)来实现进程间的同步。 ### 生产者与消费者模型 生产者与消费者模型是计算机...
此外,pv操作还可以广泛应用于各种生产者消费者问题的解决中,使得系统更为可靠和高效。 pv操作是解决生产者与消费者问题的常用方法之一。通过pv操作,我们可以确保生产者进程和消费者进程之间的同步,避免数据的...
使用多线程程序模拟实现单生产者/多消费者问题。 要求“生产者”随机产生一个整数,“消费者 1”将这个整数加 1 后输出,“消 费者 2”将这个整数加 2 后输出,“消费者 3”将这个整数加 3 后输出,“消 费者 4”将...
在Linux下完整C语言实现生产者消费者问题的代码。其中涉及信号量、多线程、GCC编译、PV操作等基础知识。Linux下通过gcc - o yy xxx.c -pthread,再通过./yy即可运行。
利用C语言程序模拟生产者-消费者问题和哲学家进餐问题。 实验设备及环境: Pc机一台,vc6.0 for windows 实验步骤: 1.以记录型信号量实现生产者-消费者问题; 2.利用AND信号量解决生产者-消费者问题; 3.利用记录...
一组生产者线程与一组消费者线程通过缓冲区发生联系。生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。缓冲区有N 个,是一个环形的缓冲池。 使用命令cc consumer.c -o consumer编译
创建一个简单的生产者消费者模型,可以使用以下伪代码: ```java class Producer implements Runnable { private final BlockingQueue<String> queue; public Producer(BlockingQueue<String> queue) { this....
在给定的程序中,作者使用了C语言和POSIX信号量来实现生产者消费者问题。程序中定义了一个共享结构体`shared_t`,其中包含了缓冲区、锁、可用信号量和空闲信号量等成员变量。生产者和消费者进程之间通过这些信号量来...
实验目的和要求 目的 1.掌握基本的同步和互斥的算法; 2.掌握生产者和消费者的原理。 要求 用c语言编程搭建“生产者和消费者”经典进程问题的环境。