操作系统实验四:多线程与信号量编程

操作系统实验上机

更多技术请访问:www.xuanworld.top

部分审核不通过的文章将发至个人博客:www.xuanworld.top

欢迎来52破解论坛阅读帖子:https://www.52pojie.cn/thread-1891208-1-1.html

实验名称实验序号实验日期实验人
多线程与信号量编程4公元2077年Rytter

一、实验题目

20240525143602

二、相关原理和知识

  1. linux有关于信号量的相关函数,可以直接调用
  2. 利用pthread进行创建进程,每个进程都会有一个id
  3. 创建进程后每个进程都会对buffer进行互斥操作

三、实验过程

  1. 编写关于信号量与进程id的函数
  2. 编写对buffer进行操作的两个函数
  3. 编写消费者与生产者的函数
  4. 编写创建生产者与消费者的函数
  5. 放到Linux服务器上进行编译和运行

四、实验结果

20240525143717

五、问题总结

  1. 编译时出现问题,原因位命令行没有使用pthread
  2. 消费者的printf代码位置不对,导致还没消费就产生输出

六、源码

首先是buffer.h文件

typedef int buffer_item;
#define BUFFER_SIZE 5

之后是main.c文件

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <stdlib.h>
#include <unistd.h>
#include "buffer.h"
buffer_item buffer[BUFFER_SIZE];
pthread_mutex_t mutex;
sem_t  full,empty;
void buffer_out(){
    int i;
    for ( i = 0; i <BUFFER_SIZE ; ++i) {
        printf("%d",buffer[i]);
    }
    printf("\n");
}
int insert_item(int a,int b){
    sem_wait(&empty);
    pthread_mutex_lock(&mutex);
    int i;
    for(i = 0;i < BUFFER_SIZE;i++){
        if(buffer[i] == 0){
            buffer[i] = 1;//找到空的位置
            break;
        }
    }

    if(i == BUFFER_SIZE) return -1;
    printf("producer %d produced %d\n",a,b);
    buffer_out();
    pthread_mutex_unlock(&mutex);
    sem_post(&full);
    return 0;
}
int remove_item(int a,int b){
    sem_wait(&full);
    pthread_mutex_lock(&mutex);
    int i;
    for(i = 0;i < BUFFER_SIZE;i++){
        if(buffer[i] != 0){
            buffer[i] = 0;
            break;
        }
    }
    if(i == BUFFER_SIZE) return -1;
    printf("consumer %d consumed %d\n",a,b);//第几个吃了几个食物
    buffer_out();
    pthread_mutex_unlock(&mutex);
    sem_post(&empty);
    return 0;
}

void * producer(void * param){
    int* num = (int*)param;
    int food_id=0;
    while(1){
        sleep(((rand() % 10) + 1));
        if(insert_item(*num,++food_id))
            printf("wrong\n");
    }
}

void * consumer(void *param){
    int* num = (int*)param;
    int food_id=0;
    while(1){
        sleep(((rand() % 10) + 1));

        if(remove_item(*num,++food_id))
            printf("wrong\n");
    }
}

int main(int argc,char *argv[])
{
    //1.获取命令行输入的数字
    if(argc != 4) return -1;
    int sleep_time = atoi(argv[1]);
    int producer_num = atoi(argv[2]);
    int consumer_num = atoi(argv[3]);
    //2.进行初始化
    pthread_mutex_init(&mutex,NULL);
    sem_init(&empty,0,BUFFER_SIZE);
    sem_init(&full,0,0);
    int i;
    for(i=0;i<BUFFER_SIZE;i++) buffer[i]=0;
    //3.创建线程
    pthread_t producer_tid[producer_num];
    int producer_id[producer_num];
    for(i = 0;i < producer_num;i++){
        producer_id[i] = i + 1;
        pthread_create(&producer_tid[i],NULL,producer,&producer_id[i]);
    }
    pthread_t consumer_tid[consumer_num];
    int consumer_id[consumer_num];
    for(i = 0;i < consumer_num;i++){
        consumer_id[i] = i + 1;
        pthread_create(&consumer_tid[i],NULL,consumer,&consumer_id[i]);
    }
    //4.休眠
    sleep(sleep_time);
    //5.退出
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/645439.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

信号量——多线程

信号量的本质就是一个计数器 在多线程访问临界资源的时候&#xff0c;如果临界资源中又有很多份分好的资源&#xff0c;那么就可以通过信号量来表示里面还有多少份资源&#xff0c;且每份资源只有一个线程可以访问 线程申请信号量成功&#xff0c;就一定有一份资源是你的&…

Golang并发编程-协程goroutine的信道(channel)

文章目录 前言一、信道的定义与使用信道的声明信道的使用 二、信道的容量与长度三、缓冲信道与无缓冲信道缓冲信道无缓冲信道 四、信道的初体验信道关闭的广播机制 总结 前言 Goroutine的开发&#xff0c;当遇到生产者消费者场景的时候&#xff0c;离不开 channel&#xff08;…

基于Matplotlib包实现可视化①——折线图绘制

Matplotlib 是一个用于创建静态、动画、 和交互式可视化的第三方库&#xff0c;也是我们在借助Python进行数据可视化时经常使用到的库&#xff0c;具有较强的可视化能力。 为让大家有一个更为直观的认识&#xff0c;这里我随机从其官方网页中摘取了几张图片。 按照惯例&#x…

【安装笔记-20240523-Windows-安装测试 ShareX】

安装笔记-系列文章目录 安装笔记-20240523-Windows-安装测试 ShareX 文章目录 安装笔记-系列文章目录安装笔记-20240523-Windows-安装测试 ShareX 前言一、软件介绍名称&#xff1a;ShareX主页官方介绍 二、安装步骤测试版本&#xff1a;16.1.0下载链接功能界面 三、应用场景屏…

2024年【危险化学品经营单位安全管理人员】考试及危险化学品经营单位安全管理人员考试资料

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员考试考前必练&#xff01;安全生产模拟考试一点通每个月更新危险化学品经营单位安全管理人员考试资料题目及答案&#xff01;多做几遍&#xff0c;其实通过危险化学品经营单位安全管理…

强化学习4:DQN 算法

看这篇文章之前&#xff0c;建议先了解一下&#xff1a;Q-Learning 算法。 1. 算法介绍 DQN 算法全称为 Deep Q-Network&#xff0c;即深度Q网络。它将 Q-Learning 与 Deep Learning 结合在了一起。 1.1 Q-Network Q-Learning 是使用 Q-table 才存储决策信息的&#xff0c;…

【Python001】python批量下载、插入与读取Oracle中图片数据(已更新)

1.熟悉、梳理、总结数据分析实战中的python、oracle研发知识体系 2.欢迎点赞、关注、批评、指正,互三走起来,小手动起来! 文章目录 1.背景说明2.环境搭建2.1 参考链接2.2 `oracle`查询测试代码3.数据请求与插入3.1 `Oracle`建表语句3.2 `Python`代码实现3.3 效果示例4.问题链…

嵌入式实时操作系统笔记3:FreeRTOS移植(STM32F407)_编写简单的FreeRTOS任务例程

上文讲到UC/OS III系统的移植&#xff0c;那篇文章是失败了的&#xff0c;网络上的资料真是层次不清&#xff0c;多有遗漏步骤&#xff0c;导致单片机连操作系统的初始化都卡在那&#xff0c;这次换个赛道&#xff0c;学FreeRTOS吧...... 今日任务如标题所示&#xff1a;FreeR…

2024年【熔化焊接与热切割】考试内容及熔化焊接与热切割考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 熔化焊接与热切割考试内容考前必练&#xff01;安全生产模拟考试一点通每个月更新熔化焊接与热切割考试报名题目及答案&#xff01;多做几遍&#xff0c;其实通过熔化焊接与热切割复审模拟考试很简单。 1、【单选题】…

Android 配置 Kapt 编译器插件

以 Android Studio 2023.3.1 最新版本为准。 步骤1:打开版本信息配置文件 找到libs.versions.toml文件。 这是打开后的样子&#xff1a; 步骤2&#xff1a;配置版本信息 你需要在[plugins]下面添加一条kapt的配置信息&#xff1a; 要添加的配置信息如下&#xff1a; jetbr…

Boxy SVG for Mac:打造精致矢量图形的得力助手

在矢量图形设计领域&#xff0c;Boxy SVG for Mac以其出色的性能和丰富的功能&#xff0c;成为了设计师们的得力助手。 Boxy SVG for Mac(矢量图编辑器) v4.32.0免激活版下载 Boxy SVG具备强大的编辑能力&#xff0c;支持节点编辑、路径绘制、颜色填充等多种操作&#xff0c;让…

小浪助手下载学浪视频的简单步骤

你是否想轻松下载学浪高清视频&#xff1f;快来尝试小浪助手&#xff0c;这是你不可错过的下载神器&#xff01;简单几步操作&#xff0c;即可轻松下载你所需的学浪视频&#xff0c;节省时间&#xff0c;提高效率&#xff01; 首先我已经打包好了小浪助手&#xff0c;有需要的…

毫米波雷达模块在智能家居安全系统中的关键技术分析

随着智能技术的不断发展&#xff0c;智能家居已经成为了现代生活的一部分。而智能家居安全系统作为智能家居的重要组成部分&#xff0c;其功能不仅仅是对家庭进行监控和报警&#xff0c;更是通过各种感知技术对家庭安全进行全方位的保障。在智能家居安全系统中&#xff0c;毫米…

二叉树的遍历(前序遍历,中序遍历,后序,层序遍历)和一些简单操作(由浅入深绝对能看懂)

欢迎大佬们的关顾能给个赞就更好啦QWQ 目录 二叉树的逻辑结构与物理结构 一.二叉树的遍历 &#xff08;1&#xff09;二叉树的前序遍历 &#xff08;2&#xff09;二叉树的中序遍历 &#xff08;3&#xff09;二叉树的后序遍历 &#xff08;4&#xff09;二叉树的层序遍历…

Python 渗透测试:电子邮件 || Redis || FTP || SSH || MySQL 集成爆破工具.

集成爆破工具. 集合爆破里面包含了&#xff1a;电子邮件爆破工具&#xff0c;Redis爆破工具&#xff0c;FTP爆破工具&#xff0c;SSH爆破工具&#xff0c;MySQL爆破工具。 目录&#xff1a; 集合爆破工具. 电子邮件 爆破工具&#xff1a; Redis 爆破工具&#xff1a; FTP …

sqlserver 创建表,列及表,列描述

-- 创建表 CREATE TABLE Employees (EmployeeID INT PRIMARY KEY,EmployeeName NVARCHAR(100),EmployeeEmail NVARCHAR(100) );-- 为表添加描述 EXEC sp_addextendedproperty name NMS_Description, value N员工信息表, level0type NSchema, level0name dbo, level1type N…

数字图像处理冈塞雷斯第四版课后习题答案【英文原版】

第二章 第三章 . 第四章 傅里叶变换是一个线性过程&#xff0c;而计算梯度的平方根和平方根则是非线性运算。傅里叶变换可以用来计算微分的差值(如问题4.50)&#xff0c;但必须在空间域中直接计算平方和平方根值。 (a)实际上&#xff0c;由于高通操作&#xff0c;环有一个暗中心…

基于MetaGPT构建LLM多智能体

前言 你好&#xff0c;我是GISer Liu&#xff0c;在上一篇文章中&#xff0c;我们用了两万多字详细拆解了单个Agent的组成&#xff0c;并通过Github Trending订阅智能体理解MetaGPT框架的订阅模块如何解决应用问题&#xff0c;但是对于复杂&#xff0c;并行的任务&#xff0c;单…

010-Linux磁盘介绍

文章目录 1、名词 2、类型 3、尺寸 4、接口/协议/总线 5、命名 6、分区方式 MBR分区 GPT分区 1、名词 磁盘是计算机主要的存储介质&#xff0c;可以存储大量的二进制数据&#xff0c;并且断电后也能保持数据不丢失。早期计算机使用的磁盘是软磁盘&#xff08;Floppy D…