操作系统lab3-进程同步实验
操作系统lab3-进程同步实验
文章目录
- 操作系统lab3-进程同步实验
- 目的和要求
- 实验内容
- 实验分析
- 生产者消费者代码
- 具体过程
目的和要求
1、加强对进程同步和互斥的理解,学会使用信号量解决资源共享问题。
2、熟悉进程同步原语。
3、掌握信号量wait/signal 原语的使用方法,理解信号量的定义、赋初值及wait/signal操作。
实验内容
编写C 程序,使用信号量机制模拟解决经典的进程同步问题:生产者-消费者问题。假设有一个生产者和一个消费者,缓冲区可以存放产品,生产者不断生产产品并存入缓冲区,消费者不断从缓冲区中取出产品并消费。
实验分析
为了模拟解决生产者-消费者问题,需要创建两个进程,即生产者进程和消费者进程,并且要让这两个进程共享同一个缓冲区。生产者进程和消费者进程必须为并发执行的进程。
下面给出的示例代码解决了一个非常简单的生产者消费者问题。代码中使用两个线程来模拟生产者和消费者,并且使用了pthread 库提供的线程操作,因此需要包含头文件pthread.h。至于信号量机制,代码中使用了POSIX 信号量机制,该机制通常用于线程同步,因此需要包含头文件semaphore.h 。
生产者消费者代码
注:想要了解更多转至黑马程序员 | linux系统编程 | 学习笔记_黑马程序员linux常用命令-CSDN博客
#include<stdio.h>
#include<semaphore.h>
#include<stdlib.h>
#include<string.h>
#include<pthread.h>
#define MAX 256
char* buffer;
sem_t empty;
sem_t full;
sem_t mutex;
void *producer()
{
sem_wait(&empty);
sem_wait(&mutex);
printf("input something to buffer:\n");
buffer=(char *)malloc(MAX);
fgets(buffer,MAX,stdin);
sem_post(&mutex);
sem_post(&full);
}
void *consumer()
{
sem_wait(&full);
sem_wait(&mutex);
printf("%s\n",buffer);
free(buffer);
sem_post(&empty);
sem_post(&mutex);
}
int main()
{
pthread_t id_producer;
pthread_t id_consumer;
int ret;
sem_init(&empty,0,10);
sem_init(&full,0,0);
sem_init(&mutex,0,1);
ret=pthread_create(&id_producer,NULL,producer,NULL);
ret=pthread_create(&id_consumer,NULL,consumer,NULL);
pthread_join(id_producer,NULL);
pthread_join(id_consumer,NULL);
sem_destroy(&empty);
sem_destroy(&full);
sem_destroy(&mutex);
printf("The End..\n");
return 0;
}
具体过程
注意:-lpthread 连接线程库,不然会报错