📄 producerandconsumer.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 + -