目录
第7关:生产者消费者问题实践
第1关:生产者消费者问题实践
1、在主线程中初始化锁为解锁状态
2、访问对象时的加锁操作与解锁操作
3、(生产和消费进程操作后)信号量操作实现进程同步
4、先等待(生产还是消费)需要的条件
5、生产者函数
6、消费者函数
第2关:进程互斥和同步
1、注意这以下4个的关系:
2、一般情况哪两个函数的参数一起配套使用
3、在第一次用完这些函数之后记得写上互斥锁,然后再调用这一类函数时之前要释放互斥锁。
4、儿子的消费进程
5、父亲的生产进程
6、女儿的消费进程
第7关:生产者消费者问题实践
第1关:生产者消费者问题实践
1、在主线程中初始化锁为解锁状态
- pthread_mutex_t mutex;
- pthread_mutex_init(&mutex, NULL);
2、访问对象时的加锁操作与解锁操作
- 加锁 pthread_mutex_lock(&mutex);
- 释放锁 pthread_mutex_unlock(&mutex);
3、(生产和消费进程操作后)信号量操作实现进程同步
- 信号量加1操作:int sem_post(sem_t *sem);
- 销毁信号量:int sem_destroy(sem_t *sem);
4、先等待(生产还是消费)需要的条件
- sem_wait(&empty);
- sem_wait(&full);
5、生产者函数
void *Producer() { int nextp = 0; int i = 0; for(; i < 10; ++i) { int time = rand() % 10 + 1; usleep(time*100000); sem_wait(&empty); //等待缓冲区有空位置,为空 pthread_mutex_lock(&mutex); nextp = nextp + 1; buffer[in] = nextp; printf("Produce one message:%d\n", nextp); fflush(stdout);//printf后请一定调用这句刷新输出缓存 in = (in + 1) % SIZE; pthread_mutex_unlock(&mutex); //互斥锁解锁 sem_post(&full); } }
6、消费者函数
void *Consumer() { //请补充消费者线程函数代码 int nextc = 0; int i=0; for(;i<10;i++){ sem_wait(&full); //等待缓冲区有东西,不为空 pthread_mutex_lock(&mutex); //加锁 nextc= buffer[out]; printf("Consume one message:%d\n", nextc); fflush(stdout);//printf后请一定调用这句刷新输出缓存 out = (out + 1) % SIZE; pthread_mutex_unlock(&mutex); //互斥锁解锁 sem_post(&empty); }
第2关:进程互斥和同步
(这个就比较简单的,仿照着写,读懂上一题就会写了)
1、注意这以下4个的关系:
- sem_wait(&empty); (意思是只要有空位置开始生产)
- sem_post(&empty);(消费完就要提示空的位置+1)
- sem_wait(&full); (意思是只要有生产的东西开始消费)
- sem_post(&full);(生产完就要提示已经生产的东西+1)
2、一般情况哪两个函数的参数一起配套使用
- 在生产进程中:先判断是否有空位置(sem_wait(&empty);)最后在生产结束之后告诉生产的东西+1(sem_post(&full);)
- 在消费的进程中:先判断是否有已经生产好的东西(sem_wait(&full);)最后在消费完之后提示空的位置+1(sem_post(&empty);)
3、在第一次用完这些函数之后记得写上互斥锁,然后再调用这一类函数时之前要释放互斥锁。
4、儿子的消费进程
(注意这里的消费的东西是:"&orange")
void *Son() { //请添加儿子线程的函数代码 while(1) { int time = rand() % 10 + 1; //随机使程序睡眠0点几秒 usleep(time * 100000); sem_wait(&orange); pthread_mutex_lock(&mutex); printf("儿子取了一个桔子\n") ; fflush(stdout); pthread_mutex_unlock(&mutex); //互斥锁解锁 sem_post(&empty); } }
5、父亲的生产进程
(生产的是苹果:"&apple" 和 "&orange")
void *Dad() { int nextp = 0; int i = 0; for(i = 0; i < 10; ++i) { int time = rand() % 10 + 1; //随机使程序睡眠0点几秒 usleep(time*100000); sem_wait(&empty); pthread_mutex_lock(&mutex); if(nextp == 0) { printf("爸爸放入了一个苹果\n"); } else { printf("爸爸放入了一个桔子\n"); } fflush(stdout); pthread_mutex_unlock(&mutex); //互斥锁解锁 if(nextp == 0) { sem_post(&apple); } else { sem_post(&orange); } nextp = 1 - nextp; } }
6、女儿的消费进程
(注意这里的消费的东西是:"&apple")
void *Daughter() { while(1) { int time = rand() % 10 + 1; //随机使程序睡眠0点几秒 usleep(time * 100000); sem_wait(&apple); pthread_mutex_lock(&mutex); printf("女儿取了一个苹果\n") ; fflush(stdout); pthread_mutex_unlock(&mutex); //互斥锁解锁 sem_post(&empty); } }