当前位置: 首页 > article >正文

操作系统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 连接线程库,不然会报错

image-20241114151250936


http://www.kler.cn/a/393492.html

相关文章:

  • 【算法一周目】双指针(2)
  • 传奇996_21——龙岭事件
  • Thread类及常见方法
  • WebAssembly在现代Web开发中的应用
  • 容器技术在DevOps中的应用
  • docker:docker: Get https://registry-1.docker.io/v2/: net/http: request canceled
  • uniapp使用scroll-view下拉刷新与上滑加载
  • idea正则表达式-正则替换示例-2024.11笔记
  • 2024中国游戏出海情况
  • attention 注意力机制 学习笔记-GPT2
  • python---基础语法
  • 【HarmonyOS】Install Failed: error: failed to install bundle.code:9568289
  • CCF认证-202403-04 | 十滴水
  • 人工智能(AI)和机器学习(ML)技术学习流程
  • python 同时控制多部手机
  • 华纳云:数据库一般购买什么服务器好?有哪些建议
  • Flink_DataStreamAPI_输出算子Sink
  • 现代无线通信接收机架构:超外差、零中频与低中频的比较分析
  • 人机界面与人们常说的“触摸屏”有什么区别?这下终于清楚了
  • Java反序列化之CommonsCollections2链的学习
  • golang go语言 组建微服务架构详解 - 代码基于开源框架grpc+nacos服务管理配置平台
  • 详解基于C#开发Windows API的SendMessage方法的鼠标键盘消息发送
  • 时序预测 | 改进图卷积+informer时间序列预测,pytorch架构
  • FPGA实现PCIE3.0视频采集转SDI输出,基于XDMA+GS2971架构,提供工程源码和技术支持
  • ASR+LLM+TTS在新能源汽车中的实战
  • 安装luasocket模块时提示“sudo: luarocks:找不到命令“问题,该如何解决?