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…

Linux的软件安装

Linux的软件安装 1、rpm软件安装包 RPM&#xff08;RedHat Package Manager&#xff09;安装管理 ​ 这个机制最早是由Red Hat开发出来,后来实在很好用,因此很多 distributions&#xff08;发行版&#xff09;就使用这个机制来作为软件安装的管理方式 。包括Fedora,CentOS,S…

概念理论类: Linux的管道机制

1、 Linux管道机制是&#xff1a; A程序的输出&#xff0c;是B程序的输入 ls | wc -l // |就像对象&#xff0c; ls输出 |&#xff0c; wc -l从这个对象取数据 2、 Linux管道&#xff0c;使得我们可以将各个命令连接起来&#xff1a; ls | wc -l 以上命令: ls的输出&#x…

CentOS添加开机启动

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

LeetCode Hot100 20.有效的括号

题目&#xff1a; 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对…

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…

通过内存标记扩展(MTE)提供增强的安全性

目录 一、内存安全BUG导致的安全漏洞 二、检测和修复内存安全漏洞的难点 三、MTE如何应对这一挑战

Day 12 周日和周一

每日博客Day 12 每日算法 三数之和 这个代码是肯定跑不了的&#xff0c;但是我个人最开始的想法确实是差不多这个样子的 class Solution { public:vector<vector<int>> threeSum(vector<int>& nums) {//两层for循环来确定ab的数值&#xff0c;然后再去…

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…

wpf 使用 StringFormat

在xaml里使用StringFormat,将两个字符串拼起来&#xff0c;一个字符串时固定不变的&#xff0c;一个字符串是动态绑定&#xff0c;如&#xff1a;平均密度&#xff1a;绑定的值 代码如下&#xff1a; <TextBlock Margin"0,0,0,0" Text"{Binding CellAverage…

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…

SpringBoot注入Bean的几种方式

目录 统一测试类与config类 1. 启动类注入Bean 2.启动类扫描ComponentScan 3.启动类EnableConfigurationProperties 4.启动类Import 统一测试类与config类 yml student:red: dou config Configuration注解 与 Component注解都可以。 Data Configuration Configuratio…

v-clock

v-clock 给元素上加了这个属性&#xff0c;初始值为display&#xff1a;none&#xff0c;登vue的文件编译结束后再删除这个元素&#xff0c;回显编译后的元素和数据 <body><div id"app"></div><template id"my-app"><h2 v-cl…

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.…

重装linux后需要做的配置

1. linux中 vim如果输入中文乱码 打开/etc/vim/vimrc输入&#xff1a; set fileencodingsutf-8,gbk set termencodingutf-8 set encodingutf-8 把vim的缩进格式顺便改了 http://t.csdnimg.cn/K3ncc 2. 配置sudo授权用户 3. 新导入项目后 , chmod -R x 添加权限 4. 查询主机i…

数组题目: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…