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

📄 producerandconsumer.c

📁 操作系统著名源代码
💻 C
字号:
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <pthread.h>#include <semaphore.h>#define N 2   // 消费者或者生产者的数目#define M 10 // 缓冲区里的数目int in = 0;   // 生产者放置产品的位置int out = 0; // 消费者取产品的位置int buff[M] = {0}; // 缓冲区初始化为0, 开始时没有产品sem_t empty_sem; // 同步信号量, 为空的时候消费者不能消费sem_t full_sem;   // 同步信号量, 为满的时候生产者不能生产pthread_mutex_t mutex; // 互斥锁申明int producer_id = 0;   //生产者idint consumer_id = 0; //消费者id/* 打印缓冲区当前情况 */void print(){int i;for(i = 0; i < M; i++)   printf("%d ", buff[i]);printf("\n");}/*syscall:系统调用转换va(虚拟地址)为revert(物理地址)*/void printadd(unsigned long va,unsigned long pid){printf("vitual address:0x%lx\n",va);unsigned long revert=syscall(333,va,pid);printf("phisical address: 0x%lx\n\n",revert);}/* 生产者方法 */ void *producer(){int id = ++producer_id;unsigned long va;unsigned long pid;pid =getpid();while(1){   // 用sleep的数量可以调节生产和消费的速度,便于观察   sleep(1);   //sleep(1);     sem_wait(&full_sem);//如果为满则不能生产   pthread_mutex_lock(&mutex);//上锁     in = in % M;   printf("producer %d in %d. like: \t", id, in);      buff[in] = 1;        va=((unsigned) &buff[in]);   print();       printadd(va,pid);   ++in;      pthread_mutex_unlock(&mutex);//解锁   sem_post(&empty_sem);  }}/* 消费者方法 */void *consumer(){int id = ++consumer_id;unsigned long va;unsigned long pid;pid = getpid();while(1){   // 用sleep的数量可以调节生产和消费的速度,便于观察   sleep(1);//sleep(1);     sem_wait(&empty_sem);   pthread_mutex_lock(&mutex);     out = out % M;   printf("consumer %d in %d. like: \t", id, out);     buff[out] = 0;   va=((unsigned)&buff[out]);   print();   printadd(va,pid);   ++out;     pthread_mutex_unlock(&mutex);   sem_post(&full_sem);}}int main(){pthread_t id1[N];pthread_t id2[N];int i;int ret[N];// 初始化同步信号量int ini1 = sem_init(&full_sem, 0, M); int ini2 = sem_init(&empty_sem, 0, 0);  if(ini1 && ini2 != 0){   printf("sem init failed \n");   exit(1);} //初始化互斥锁int ini3 = pthread_mutex_init(&mutex, NULL);if(ini3 != 0){   printf("mutex init failed \n");   exit(1);} // 创建N个生产者线程for(i = 0; i < N; i++){   ret[i] = pthread_create(&id1[i], NULL, producer, (void *)(&i));   if(ret[i] != 0)   {    printf("producer %d creation failed \n", i);    exit(1);   }}//创建N个消费者线程for(i = 0; i < N; i++){   ret[i] = pthread_create(&id2[i], NULL, consumer, NULL);   if(ret[i] != 0)   {    printf("consumer %d creation failed \n", i);    exit(1);   }}//销毁线程for(i = 0; i < N; i++){   pthread_join(id1[i],NULL);   pthread_join(id2[i],NULL);}exit(0); }

⌨️ 快捷键说明

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