Linux实验七:线程管理

目录

    • 一、实验目的
    • 二、实验内容
    • 三、实验环境
    • 四、参考代码
    • 五、实验步骤
      • 步骤1. 编辑源代码test7.c
      • 步骤2. 编译源代码test7.c
      • 步骤3. 运行可执行程序test7
      • 步骤4. 进一步调试源代码test7.c
    • 六、实验结果
    • 七、实验总结


一、实验目的

1、深入理解线程模型相关概念;
2、掌握线程相关的数据结构及常用的函数。

二、实验内容

线程A向终端打印字符 “1”,线程B向终端打印字符 “2”。要求使用 POSIX 线程和信号量实现以下功能:向终端打印 “1 2 1 2”。

三、实验环境

虚拟机软件:VMware 16 Pro
Linux操作系统版本:CentOS-7-64位

四、参考代码

#include<semaphore.h>
#include<pthread.h>
#include<stdio.h>
#include<stdlib.h>

void* funA(void*);
void* funB(void*);

sem_t sem1,sem2;
int main(void){
    pthread_t tid1,tid2;
    int i=0;

    sem_init(&sem1,0,1);
    sem_init(&sem2,0,0);
    for(i=0;i<2;i++){
        pthread_create(&tid1,NULL,funA,NULL);
        pthread_create(&tid2,NULL,funB,NULL);
        pthread_join(tid1,NULL);
        pthread_join(tid2,NULL);
    }
    printf("\n");
    sem_destroy(&sem1);
    sem_destroy(&sem2);
    return 0;
}

void* funA(void* arg){
    sem_wait(&sem1);
    printf("1\t");
    sem_post(&sem2);
    return NULL;
}

void* funB(void* arg){
    sem_wait(&sem2);
    printf("2\t");
    sem_post(&sem1);
    return NULL;
}

五、实验步骤

步骤1. 编辑源代码test7.c

源代码test7.c内容见上述参考代码。

mkdir test7
cd test7
vim test7.c

在这里插入图片描述

步骤2. 编译源代码test7.c

gcc test7.c -o test7 -g -pthread

在这里插入图片描述

步骤3. 运行可执行程序test7

./test7

在这里插入图片描述

步骤4. 进一步调试源代码test7.c

实现以上的Linux的C程序,并做如下改动:

(1)在funA内,把原来输出的“1”改成输出自己的学号。

void* funA(void* arg){
    sem_wait(&sem1);
    printf("123456789\t");
    sem_post(&sem2);
    return NULL;
}

(2)在funB内,把原来输出的“2”改成输出自己的姓名。

void* funB(void* arg){
    sem_wait(&sem2);
    printf("zhc\n");
    sem_post(&sem1);
    return NULL;
}

(3)将main函数的for循环次数改为5次。

(4)在main函数的第一个pthread_join前边,输出“我是主线程,子线程已启动完毕,我将阻塞自己\n”。

(5)在main函数的第二个pthread_join后边,输出“我是主线程,子线程都已结束,我将继续运行\n”。

for(i=0;i<5;i++){
    pthread_create(&tid1,NULL,funA,NULL);
    pthread_create(&tid2,NULL,funB,NULL);
    printf("我是主线程,子线程已启动完毕,我将阻塞自己\n");
    pthread_join(tid1,NULL);
    pthread_join(tid2,NULL);
    printf("我是主线程,子线程都已结束,我将继续运行\n");
}

重新进行编译运行:

在这里插入图片描述

六、实验结果

完整代码如下:

#include<semaphore.h>
#include<pthread.h>
#include<stdio.h>
#include<stdlib.h>

void* funA(void*);
void* funB(void*);

sem_t sem1,sem2;
int main(void){
    pthread_t tid1,tid2;
    int i=0;

    sem_init(&sem1,0,1);
    sem_init(&sem2,0,0);
    for(i=0;i<5;i++){
        pthread_create(&tid1,NULL,funA,NULL);
        pthread_create(&tid2,NULL,funB,NULL);
        printf("我是主线程,子线程已启动完毕,我将阻塞自己\n");
        pthread_join(tid1,NULL);
        pthread_join(tid2,NULL);
        printf("我是主线程,子线程都已结束,我将继续运行\n");
    }
    printf("\n");
    sem_destroy(&sem1);
    sem_destroy(&sem2);
    return 0;
}

void* funA(void* arg){
    sem_wait(&sem1);
    printf("123456789\t");
    sem_post(&sem2);
    return NULL;
}

void* funB(void* arg){
    sem_wait(&sem2);
    printf("zhc\n");
    sem_post(&sem1);
    return NULL;
}

运行结果如下:

在这里插入图片描述

七、实验总结

  这个实验主要是使用 POSIX 线程和信号量来实现线程间的同步输出,让两个线程交替向终端打印字符 “1” 和 “2”。在这个实验中,我学到了如何使用信号量来控制线程的执行顺序,以及如何使用 POSIX 线程库来创建和管理线程。
  首先,我对信号量有了更深入的了解。在这个实验中,我使用了两个信号量sem1sem2,分别用于控制两个线程的执行顺序。通过sem_waitsem_post函数来操作信号量,我成功地实现了线程间的同步输出。这让我对信号量的作用有了更清晰的认识,它可以有效地管理和控制线程的执行顺序,避免出现竞争条件和资源冲突。
  其次,我对 POSIX 线程库有了更深入的了解。通过使用pthread_createpthread_join函数,我成功地创建了两个线程并等待它们的结束。我意识到线程的创建和管理是需要仔细考虑的,特别是在涉及到线程间的通信和同步时,需要确保线程的执行顺序是可控的和可预测的。
  在整个实验过程中,我遇到了一些问题,比如最初的编译错误,但通过查找资料和尝试不同的方法,我最终成功地解决了这些问题。这让我明白了在编程过程中遇到困难时要保持耐心,并且善用搜索引擎和查阅相关文档,这对于解决问题非常重要。
  总的来说,这个实验让我对信号量和 POSIX 线程有了更深入的理解,我学会了如何使用它们来实现线程间的同步和协作。同时,我也体会到了在编程实践中遇到问题时要有耐心和勇于尝试新的方法的重要性。这将对我的日后的编程工作和学习都大有裨益。

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

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

相关文章

SpringBoot实现发送邮件功能

目录 一、开启邮件服务 二、导入pom依赖 三、配置yml文件 四、发送邮件 4.1、发送文字邮件 4.2、发送html邮件 4.3、发送附件邮件 4.4、发送图片邮件 一、开启邮件服务 这里拿QQ邮箱举例。 翻到下面进行开启,之后获取授权码。 二、导入pom依赖 <dependency><…

AlaSQL.js:用SQL解锁JavaScript数据操作的魔法

简介 先附上 github 地址 https://github.com/AlaSQL/alasql AlaSQL.js - JavaScript SQL database for browser and Node.js. Handles both traditional relational tables and nested JSON data (NoSQL). Export, store, and import data from localStorage, IndexedDB, or …

【机器学习】机器学习与智能交通在智慧城市中的融合应用与性能优化新探索

文章目录 引言机器学习与智能交通的基本概念机器学习概述监督学习无监督学习强化学习 智能交通概述交通流量预测交通拥堵管理智能信号控制智能停车管理 机器学习与智能交通的融合应用实时交通数据分析数据预处理特征工程 交通流量预测与优化模型训练模型评估 智能信号控制与优化…

mysql中事务的简介

大家好。我们在日常开发过程中肯定都或多或少的用到过事务&#xff0c;而且在面试时&#xff0c;数据库的事务也是必问内容之一。今天我们就来说说mysql的事务。 为了方便我们下面内容的讲解&#xff0c;我们也先建立一个讲事务必用的表–account表&#xff0c;并在表中插入两…

2024上半年主播又买了啥好东西? | 老高居然买了仨手机当望远镜用!

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 朱峰 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / &#xff08;新&#xff09;声湃轩北京录音间 本期节目绝无广告&#xff0c;如有需要&#xff0c;我们还可以提供购买记录 …

Qt 简易Word

Ui界面如下&#xff1a; 查找和替换界面&#xff1a; 具体代码&#xff1a; GitHub : 简易Word Gitee : 简易Word

el-table合计行前置在首行,自定义合计行方法

背景 el-table原生合计行是在标签内增加show-summary属性&#xff0c;在表尾实现设计合计&#xff0c;且只对表格当前页面显示的列数据进行合计。element-UI效果如下图所示。 现要求在首行显示合计行&#xff0c;并自定义合计逻辑实现如下效果。 图示表格中&#xff0c;成本…

正宇软件助力青岛打造智慧政协平台,引领新时代政协工作创新

在当前数字化、智能化浪潮的推动下&#xff0c;青岛市政协紧跟时代步伐&#xff0c;以“百舸争流奋楫先”的精神&#xff0c;不断开拓创新&#xff0c;推动政协工作高质量发展。5月30日&#xff0c;人民政协报报道了青岛市政协在推动高质量发展、加强思想政治引领、凝聚合作共识…

李学龙 :涉水视觉

源自&#xff1a;电子学报 作者&#xff1a;李学龙 注&#xff1a;若出现无法显示完全的情况&#xff0c;可搜索“人工智能技术与咨询”查看完整文章 摘 要 地球表面有约71%的面积被江河湖海等水体覆盖&#xff0c;陆地上的成像也会受到云雪雨雾等水体影响&#xff0c;但是…

C++三大特性之继承,详细介绍

阿尼亚全程陪伴大家学习~ 前言 每个程序员在开发新系统时&#xff0c;都希望能够利用已有的软件资源&#xff0c;以缩短开发周期&#xff0c;提高开发效率。 为了提高软件的可重用性(reusability)&#xff0c;C提供了类的继承机制。 1.继承的概念 继承&#xff1a; 指在现有…

软件项目建设方案编制参考模板(Word原件)

1 引言 1.1 编写目的 1.2 项目概述 1.3 名词解释 2 项目背景 3 业务分析 3.1 业务需求 3.2 业务需求分析与解决思路 3.3 数据需求分析【可选】 4 项目建设总体规划【可选】 4.1 系统定位【可选】 4.2 系统建设规划 5 建设目标 5.1 总体目标 5.2 分阶段目标【可选】 5.2.1 业务目…

迅为RK3562开发板ARM四核A53核心板瑞芯微国产人工智能Linux安卓

iTOP-3562开发板采用瑞芯微RK3562处理器&#xff0c;内部集成了四核A53Mali G52架构&#xff0c;主频2GHZ&#xff0c;内置1TOPSNPU算力&#xff0c;RK809动态调频。支持OpenGLES1.1/2.0/3.2、0penCL2.0、Vulkan 1.1内嵌高性能2D加速硬件。 内置独立NPU, 算力达 1TOPS,可用于轻…

硬件I2C读写MPU6050

硬件I2C读写MPU6050 SCL接PB10&#xff0c;SDA接PB11,但是硬件I2C引脚不可以任意指定。 查询引脚定义表&#xff0c;来规划引脚。但由于PB6,7,8,9被OLEDz占用&#xff0c;不方便接线了。 可以使用I2C2引脚&#xff0c;但必须是SCL对应PB10&#xff0c;SDA对应PB11&#xff0c;…

嵌入式Linux系统编程 — 2.3 标准I/O库:格式化I/O

目录 1 格式化I/O简介 2 格式化输出 2.1 格式化输出函数简介 2.2 格式控制字符串 format 2.3 示例程序 3 格式化输入 3.1 格式化输入简介 3.2 格式控制字符串 format 3.3 示例程序 1 格式化I/O简介 在先前示例代码中&#xff0c;经常使用库函数 printf() 来输出程序中…

数据分析中的统计学基础及Python具体实现【数据分析】

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…

python的line[:-1]和line[-1]

line[:-1]其实就是去除了这行文本的最后一个字符(换行符)后剩下的部分。 line = "abcde" line[:-1] 结果为:abcd line = "abcde" line[::-1] 结果为:edcba 示例3 [m : ] 代表列表中的第m+1项到最后一项 [ : n] 代表列表中的第一项到第n项 [-1] 代…

基于jeecgboot-vue3的Flowable流程-已办任务(一)

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、api接口部分 import { defHttp } from //utils/http/axios;enum Api {flowRecord /flowable/task/flowRecord,finishedListNew /flowable/task/finishedListNew,revokeProcess /flo…

2024年自然语言处理科学与信息检索技术国际会议(ICNLPSIRT 2024)

2024年自然语言处理科学与信息检索技术国际会议(ICNLPSIRT 2024) 2024 International Conference on Natural Language Processing Science and Information Retrieval Technology (ICNLPSIRT 2024) 会议地点&#xff1a;武汉&#xff0c;中国 网址&#xff1a;http://www.i…

【递归、搜索与回溯】搜索

搜索 1.计算布尔二叉树的值2.求根节点到叶节点数字之和3. 二叉树剪枝4.验证二叉搜索树5.二叉搜索树中第K小的元素6.二叉树的所有路径 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一…

深入ES6:解锁 JavaScript 类与继承的高级玩法

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; ES5、ES6介绍 文章目录 &#x1f4af;Class&#x1f35f;1 类的由来&#x1f35f;2 co…