⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 full_empty.c

📁 这是操作系统课
💻 C
字号:
/* 用信号量解决生产者-消费者问题 */

#include <stdio.h>

#define N 10

typedef int semaphore;	/* 信号量是一种特殊的整型变量 */
 
 semaphore mutex=1;		/* 互斥访问 */
 semaphore empty=N;		/* 记录缓冲区中空的槽数 */
 semaphore full=0;		/* 记录缓冲区中满的槽数*/

 semaphore buf[N];		/* 有N个槽数的缓冲区buf[N],并实现循环缓冲队列 */
 semaphore front=0, rear=0;
 
  void p(semaphore *x)	/* p操作 */
 {
	*x=(*x)-1;
 }

 void v(semaphore *y)	/* v操作 */
 {
	*y=(*y)+1;
 }

  void produce_item(int *item_ptr)
 {
	/*printf("produce an item\n");*/
	*item_ptr='m';		/* 'm' is "man满" */
 }

 void enter_item(int x)
 {
	front=(front+1)%N;
	buf[front]=x;		
	printf("enter_item %c to buf[%d]\n", buf[front], front);
 }

void remove_item(int *yy)
{
	rear=(rear+1)%N;
	printf("remove_item %c from buf[%d]", buf[rear], rear);
	*yy=buf[rear];
	buf[rear]='k';		/* 'k' is "kong空" */
	printf("  so the buf[%d] changed to empty--%c\n", rear, buf[rear]);
}
void consume_item(int y)
{
	printf("cosume the item :the screem print %c\n", y);
}

void producer(void);
void consumer(void);

/* 生产者 */
void producer(void)
{
	int item;

	while(1){
		produce_item(&item);
		p(&empty);			/* 递减空槽数 */
		p(&mutex);			/* 进入临界区 */
		enter_item(item);	/* 将一个新的数据项放入缓冲区 */
		v(&mutex);			/* 离开临界区 */
		v(&full);			/* 递增满槽数 */
		if(full==N)			/* 若缓冲区满的话,唤醒消费者进程 */
			consumer();
	} 
}

/* 消费者 */
void consumer(void)
{
 	int get_item;

	while(1){
			p(&full);			/* 递减满槽数 */
			p(&mutex);			/* 进入临界区 */
			remove_item(&get_item);	/* 从缓冲区中取走一个数据项 */
			v(&mutex);			/* 离开临界区 */
			v(&empty);			/* 递增空槽数 */
			consume_item(get_item);	/* 对数据项进行操作(消费)*/
			if(empty==N)		/* 若缓冲区全空的话,唤生产者进程 */
				producer();			
	}
 }

 /* 调用生产者-消费者进程实现进程间同步 */
 main()
{
	producer();

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -