2023-11-27操作系统---进程—线程—实验

目录

2023-11-27操作系统_进程—线程_实验

5-10:

代码:

运行结果:

5-11

代码:

运行结果:​编辑


2023-11-27操作系统实验

5-10:

代码:

#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<pthread.h>
char message[50]="Hello World ";
void * thread_function(void *arg){int k;
printf("= = = Tread_function1 is running.Argument was %s \n",(char *)arg);
for(k=0;k<10;k++){sleep(rand()%3);strcpy(message,"ANOTHER THREAD!");pthread_exit(" = = = Thank you for your CPU time!");
sleep(rand()%3);
strcpy(message,"THREAD!");
}
pthread_exit("= = = Thank you for your CPU time!");
}
void *thread_function2(void*arg){int k;printf("= = = Tread_function2 is running.Argument was %s \n",(char *)arg);for(k=0;k<10;k++){sleep(rand()%3);strcpy(message,"ANOTHER THREAD!");}pthread_exit("= = = Thank you for your CPU time!");
}
int main(){int res,k;pthread_t thread1;pthread_t thread2;void* thread_result;res=pthread_create(&thread1,NULL,thread_function,(void*)message);res=pthread_create(&thread2,NULL,thread_function2,(void*)message);for(k=0;k<20;k++){sleep(1);printf("Message is now %s \n",message);}exit(EXIT_FAILURE);
}

首先,包含了一些头文件,这些头文件提供了一些函数和数据类型的声明,以便在代码中使用。

接下来,定义了一个全局变量 `message`,它是一个字符数组,长度为50,用于存储消息。

然后,定义了两个线程函数 `thread_function()` 和 `thread_function2()`。这些函数将作为线程的入口点,在被创建的线程中执行。

在 `main()` 函数中,声明了一些变量,包括线程标识符、线程返回值等。然后,调用 `pthread_create()` 函数来创建两个线程 thread1 和 thread2,同时传递线程函数指针和参数。

接下来是一个 for 循环,循环20次。在每次循环中,主线程会休眠1秒钟,并输出全局变量 `message` 的值。

现在让我们来看看线程函数 `thread_function()`。首先,它打印一条消息,然后进入一个 for 循环,循环10次。在每次循环中,线程会休眠随机时间(0到2秒之间),然后将字符串 "ANOTHER THREAD!" 复制到全局变量 `message` 中。接着,线程会调用 `pthread_exit()` 函数,退出线程,并返回一个退出消息。

线程函数 `thread_function2()` 与 `thread_function()` 类似。它也打印一条消息,然后进入一个 for 循环,循环10次。在每次循环中,线程会休眠随机时间,并将字符串 "ANOTHER THREAD!" 复制到全局变量 `message` 中。最后,线程调用 `pthread_exit()` 函数,退出线程,并返回一个退出消息。

当主线程执行完循环后,调用 `exit()` 函数来退出程序。

总结来说,这段代码展示了如何创建和运行多个线程,并且演示了线程之间共享数据的概念。两个线程会修改全局变量 `message` 的值,并且通过休眠和复制操作展示线程的并发执行。主线程则在循环中输出全局变量的值,以观察线程对该值的修改。

运行结果:

5-11

代码:

#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<pthread.h>
char message[50]="Hello World";
void *thread_function(void*arg)
{printf("= = = CHild run and want to sleep(5).message Now is %s \n",(char*)arg);
sleep(5);
strcpy(message,"HELLO FATHER!");
pthread_exit("= = = Thank you for your CPU time !");
}
int main(){int res;pthread_t threadCH;void *thread_result;res=pthread_create(&threadCH,NULL,thread_function,(void*)message);if(res!=0){perror("Thread creation failed!");exit(EXIT_FAILURE);}printf("MAIN THREAD is Waiting for thread to finish by JOIN....\n");res=pthread_join(threadCH,&thread_result);if(res!=0){perror("Thread join failed!\n");exit(EXIT_FAILURE);}printf("CHILD THREAD returned %s \n",(char*)thread_result);printf("Message NOW is  %s \n",message);
exit(EXIT_FAILURE);
}

 

这段代码使用了 POSIX 线程库来创建一个线程,并在主线程中等待子线程执行完毕后再退出程序。下面是具体的解释:

首先,头文件包含了一些必要的库,比如 `unistd.h`、`stdio.h`、`stdlib.h`、`string.h` 和 `pthread.h`。

然后,定义了一个字符数组 `message`,并初始化为 "Hello World"。

接着,定义了一个线程函数 `thread_function()`,它的作用是将全局变量 `message` 的值修改为 "HELLO FATHER!",并在子线程中调用 `pthread_exit()` 函数以退出线程。

在 `main()` 函数中,声明了一些变量,包括线程标识符、线程返回值等。

接下来,调用 `pthread_create()` 函数来创建一个子线程 `threadCH`,同时传递线程函数指针和参数。在这里,我们传递了全局变量 `message` 的地址作为参数。

如果 `pthread_create()` 函数返回值不为 0,则表示线程创建失败,此时输出错误信息并通过 `exit()` 函数退出程序。

在成功创建子线程后,主线程输出一条消息,表示正在等待子线程执行完毕。

接着,调用 `pthread_join()` 函数来等待子线程结束,并获取其返回值。如果 `pthread_join()` 函数返回值不为 0,则表示等待子线程失败,此时输出错误信息并通过 `exit()` 函数退出程序。

最后,主线程输出子线程的返回值和全局变量 `message` 的值,并通过 `exit()` 函数结束程序。

总体来说,这段代码演示了如何使用 POSIX 线程库来创建和控制线程,以及如何在线程中共享全局变量。在子线程中,我们将全局变量 `message` 的值修改为 "HELLO FATHER!",并在主线程中等待子线程执行完毕后输出其返回值和最终的 `message` 值。

运行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

<JavaEE> 线程的五种创建方法 和 查看线程的两种方式

目录 一、线程的创建方法 1.1 继承 Thread -> 重写 run 方法 1.2 使用匿名内部类 -> 继承 Thread -> 重写 run 方法 1.3 实现 Runnable 接口 -> 重写 run 方法 1.4 使用匿名内部类 -> 实现 Runnable 接口 -> 重写 run 方法 1.5 使用 lambda 表达式 二…

「Verilog学习笔记」非整数倍数据位宽转换8to12

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 要实现8bit数据至12bit数据的位宽转换&#xff0c;必须要用寄存器将先到达的数据进行缓存。8bit数据至12bit数据&#xff0c;相当于1.5个输入数据拼接成一个输出数据&#…

IDEA DeBug

文章目录 01_Debug简介和意义02_IDEA中的Debug步骤03_跳转到当前代码执行的行04_步过调试的使用05_步入调试的使用06_强制步入调试的使用07_步出调试的使用08_回退断点调试的使用09_运行到光标处10_计算表达式11_条件断点12_多线程调试 01_Debug简介和意义 什么是程序DeBug&am…

Python读取modbus RTU协议

Python读取modbus RTU协议 下载modbus_tk库 pip3 install modbus_tkexecute主要函数 参考文章Python玩转modbus 软件模拟 vspdmodbus slave 虚拟COM1和COM2 modbus slave连接COM2口 更改从机数据 Python读取 import serial from modbus_tk import defines as cst from m…

CentOS添加开机启动

1.编写项目启动脚本&#xff08;run.sh&#xff09; #!/bin/bash-切换到程序所在路径 cd /home/cavs_install/app/cavs-admin/target/ # 等待其他组件启动完毕后再启动本项目&#xff08;如果不需要等待&#xff0c;本步骤可省略&#xff09; sleep 300 # 实际启动命令 nohup …

Java核心知识点整理大全19-笔记

目录 14.1.5.2. MemStore 刷盘 全局内存控制 MemStore 达到上限 RegionServer 的 Hlog 数量达到上限 手工触发 关闭 RegionServer 触发 Region 使用 HLOG 恢复完数据后触发 14.1.6.HBase vs Cassandra 15. MongoDB 15.1.1. 概念 15.1.2. 特点 16. Cassandra 16.1.1…

MATLAB实战 | 不同形式的三维曲面图

通常&#xff0c;MATLAB中绘制三维曲面图&#xff0c;先要生成网格数据&#xff0c;再调用mesh函数和surf函数绘制三维曲面。若曲面用含两个自变量的参数方程定义&#xff0c;则还可以调用fmesh函数和fsurf函数绘图。若曲面用隐函数定义&#xff0c;则可以调用fimplicit3函数绘…

【JUC】十三、CompletableFuture的常用方法

文章目录 1、获得结果和触发计算2、对计算结果进行处理3、对结算结果进行消费4、CompletableFuture的thenXX和thenXXAsync5、对计算速度进行选用6、对计算结果进行合并 1、获得结果和触发计算 获取任务结果 public T get()public T get(long timeout, TimeUnit unit)public T…

STM32F103C8T6——4路PWM

//main()函数前面的extern TIM_HandleTypeDef htim2;extern TIM_HandleTypeDef htim3;//main()函数内部额外添加的HAL_TIM_Base_Start_IT(&htim2);HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);HAL_TIM_PWM_Start(&htim2…

013 C++ set与map的用法

前言 本文将会向你介绍set与map的主要用法 set详解 int main() {set<string> s;vector<string> v { "Fan1","Fan2", "Fan3", "Fan4" };for (auto e : v){s.insert(e);}string input;while (cin >> input){if (s.…

数组题目:118. 杨辉三角 、 119. 杨辉三角 II 、661. 图片平滑器 、598. 范围求和 II 、 419. 甲板上的战舰

118. 杨辉三角 思路&#xff1a; 找规律&#xff0c;每一行的第一个元素和最后一个元素都是1&#xff0c;其中中间需要改变的数找对应的规律 比如第二行&#xff08;从0开始&#xff09;的2&#xff0c;是dp[1][0] dp[1][1]。类似的找出对应的规律 代码&#xff1a; clas…

【网络安全】-常见的网站攻击方式详解

文章目录 介绍1. SQL 注入攻击攻击原理攻击目的防范措施 2. 跨站脚本攻击&#xff08;XSS&#xff09;攻击原理攻击目的防范措施 3. CSRF 攻击攻击原理攻击目的防范措施 4. 文件上传漏洞攻击原理攻击目的防范措施 5. 点击劫持攻击原理攻击目的防范措施 结论 介绍 在数字时代&a…

aspera传输方案怎么样,需要选择aspera替代方案吗

Aspera传输方案是一种高速、可靠的文件传输解决方案&#xff0c;适用于需要大规模传输大文件或数据集的企业和组织。Aspera采用UDP协议及自己开发的FASP协议进行加速传输&#xff0c;能够在高延迟、高丢包网络环境下实现稳定快速的传输。 Aspera传输方案具有以下优点&#xff1…

Selenium Grid

Selenium Grid 什么是Selenium Grid Selenium是Selenium套件的一部分,它专门用于并行运行多个测试用例在不同的浏览器、操作系统和机器上 Selenium Grid的两个版本 Grid1与Grid2两个版本的原理和基本工作方式完全相同&#xff0c;Grid2同时支持Selenium1和Selenium2&#x…

<JavaEE> Thread线程类 和 Thread的常用方法

目录 一、Thread概述 二、构造方法 三、常用方法 1.1 getId()、getName()、getState()、getPririty() 1.2 start() 1.3 isDaemon()、setDaemon() 1.4 isAlive() 1.5 currentThread() 1.6 Interrupt()、interrupted()、isInterrupted() 1.6.1 方法一&#xff1a;添加共…

stream流和方法引用

1.Stream流 1.1体验Stream流【理解】 案例需求 按照下面的要求完成集合的创建和遍历 创建一个集合&#xff0c;存储多个字符串元素把集合中所有以"张"开头的元素存储到一个新的集合把"张"开头的集合中的长度为3的元素存储到一个新的集合遍历上一步得到的集…

SIT65HVD75,可替代SN65HVD75,3.0~5.5V 供电,ESD 15kV HBM,20Mbps 半双工 RS485/RS422 收发器

SIT65HVD75 是一款 3.0V~5.5V 电源供电、总线端口 ESD 保护能力 HBM 达到 15kV 以上、 总线耐压范围达到 15V 、半双工、低功耗&#xff0c;功能完全满足 TIA/EIA-485 标准要求的 RS-485 收发 器。 SIT65HVD75 包括一个驱动器和一个接收器&#xff0c;两者均可…

模板上新|2023年10月DataEase模板市场上新动态

DataEase开源数据可视化分析平台于2022年6月正式发布模板市场&#xff08;https://dataease.io/templates/&#xff09;。模板市场旨在为DataEase用户提供专业、美观、拿来即用的仪表板模板&#xff0c;方便用户根据自身的业务需求和使用场景选择对应的仪表板模板&#xff0c;并…

计算机网络——数据链路层-数据链路层概述(介绍、三个重要问题、使用广播信道的数据链路层、其他问题)

目录 介绍 三个重要问题 封装成帧 差错检测 可靠传输 使用广播信道的数据链路层 其他问题 介绍 本篇对数据链路层进行概述&#xff0c;我们首先来看看数据链路层在网络体系结构中的地位&#xff1a; 主机H1给主机H2发送数据&#xff0c;中间要经过三个路由器和电话网、…

单片机学习10——独立按键

独立按键输入检测&#xff1a; #include<reg52.h>sbit LED1P1^0; sbit KEY1P3^4;void main() {KEY11;while(1){if(KEY10) //KEY1按下{LED10; //LED1被点亮}else{LED11;}} } 按键 #include<reg52.h>#define uchar unsigned char #define uint unsigned intsbit …