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

📄 os_pc.c

📁 Linux下模拟并发程序的执行实例
💻 C
字号:
/*
生产者、消费者问题
<i>一个有限缓冲区和两类线程,它们是生产者和消费者,生产者把产品放入缓冲区,相反消费者便是从缓冲区中拿走产品。
生产者在缓冲区满时必须等待,直到缓冲区有空间才继续生产。消费者在缓冲区空时必须等待,直到缓冲区中有产品才能继续读取。
在这个问题上主要考虑的是:缓冲区满、缓冲区空和竞争条件的选择与判断。

empty —— 表示缓冲区是否为空,初值为n.
full —— 表示缓冲区是否为满,初值为0.
mutex - 表示对缓冲区互斥访问加的信号灯,初值为1。

消费者进程内容描述:
consumer(){
	while(true){
		p(full);
		p(mutex);
		从缓冲区buffer中取出一个商品;
		v(mutex);
		v(empty);
		消费该产品;
	}
}

生产者进程内容描述:
productor(){
	while(true){
		生产一个产品;
		p(empty);
		p(mutex);
		产品送往缓冲区buffer;
		v(mutex);
		v(full);
	}
}

主函数描述:
main()
{
	cobegin
	productor();
	consumer();
	coend
}

*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
#include <sys/ipc.h>
#include <semaphore.h>
#include <fcntl.h>
#include "queue.h"
#include "const.h"
#define N 10

time_t end_time;
sem_t mutex,full,empty;
Queue *qt; /*缓冲区*/
ElemType p;

void consumer(void *arg);
void productor(void *arg);

int main(int argc, char *argv[])
{
	pthread_t id1,id2;
    int ret;
	end_time = time(NULL)+30;
	qt = InitQueue();
	p.lNumber = 1000;
    ret=sem_init(&mutex,0,1);        /*初使化互斥信号量为1*/
    ret=sem_init(&empty,0,N);        /*初使化empty信号量为N*/
    ret=sem_init(&full,0,0);         /*初使化full信号量为0*/
	if(ret!=0)
	{
		perror("sem_init");
	}
	ret = pthread_create(&id1,NULL,(void *)productor, NULL);        /*创建两个线程*/
    if(ret!=0)
	{
        perror("pthread id1");
	}
    ret = pthread_create(&id2,NULL,(void *)consumer, NULL);
    if(ret!=0)
	{
		perror("pthread id2");
	}
    pthread_join(id1,NULL);
    pthread_join(id2,NULL);
	return 0;
}

/*生产者线程*/
void productor(void *arg)
{
   while(time(NULL) < end_time){
	   sem_wait(&empty);/* p(empty) */
       sem_wait(&mutex);/*p(mutex)*/
	   if(QueueFull(*qt) == TRUE)
	   {
		   /*队满*/
		   printf("Productor:buffer is full now, please try to write later.\n");
       }
       else
       {
		   EnQueue(qt,p);
           printf("Productor:write [%d] to buffer \n", p.lNumber);
           p.lNumber++;
       }
	   sem_post(&mutex);/*v(mutex)*/
       sem_post(&full);/*v(full)*/
       sleep(1);
   }
}/*productor*/

/*消费者线程*/
void consumer(void *arg)
{
	ElemType p2;
	while((time(NULL) < end_time)||((QueueEmpty(*qt)) == FALSE))
	{
		sem_wait(&full);/*p(full)*/
		sem_wait(&mutex);/*p(mutex)*/
		if(QueueEmpty(*qt) == TRUE)
        {
			/*队空*/
			printf("Consumer:the buffer is empty,please try to read later.\n");
        }
        else
        {
			DeQueue(qt,&p2);
			printf("Consumer:read [%d] from buffer.\n", p2.lNumber);
        }
		sem_post(&mutex);/*v(mutex)*/
		sem_post(&empty);/*v(empty)*/
		
        sleep(2);
    }
}/*consumer*/

⌨️ 快捷键说明

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