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

news2024/11/25 20:23:48

目录

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.coloradmin.cn/o/1260225.html

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

相关文章

力扣hot100 滑动窗口最大值 单调队列

&#x1f468;‍&#x1f3eb; 题目地址 &#x1f37b; AC code class Solution {public int[] maxSlidingWindow(int[] nums, int k){int n nums.length;int[] res new int[n - k 1]; // 单调递减队列int[] q new int[n];// q数组维护的是元素在 nums 数组对应的下标int…

FFmepg 核心开发库及重要数据结构与API

文章目录 前言一、FFmpeg 核心开发库二、FFmpeg 重要数据结构与 API1、简介2、FFmpeg 解码流程①、FFmpeg2.x 解码流程②、FFmpeg4.x 解码流程 3、FFMpeg 中比较重要的函数以及数据结构①、数据结构②、初始化函数③、音视频解码函数④、文件操作⑤、其他函数 三、FFmpeg 流程1…

史上最细,2个半月从功能进阶自动化测试,进阶指南...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、学习自动化之前…

算法通关村第一关|链表基础

1. 单链表概念 对于所有的数据结构的基础都是创建增删改查&#xff0c;学习链表重点也是学习链表的五种基本操作。 单向链表就像一个铁链一样&#xff0c;元素之间相互连接&#xff0c;包含多个结点&#xff0c;每个结点有一个指向后继元素的next指针。表中最后一个元素的nex…

【文献阅读笔记】关于GANomaly的异常检测方法

文章目录 1、GANomaly: Semi-Supervised Anomaly Detection via Adversarial Training模型主要创新 2、Skip-GANomaly: Skip Connected and AdversariallyTrained Encoder-Decoder Anomaly Detection模型主要创新点 3、Industrial surface defect detection and localization u…

AMP State Evolution的计算:以伯努利高斯先验为例

AMP State Evolution (SE)的计算 t 1 t1 t1时&#xff0c; E ( t ) E [ X 2 ] \mathcal E^{(t)} \mathbb E [X^2] E(t)E[X2]&#xff0c;SE的迭代式为 τ r ( t ) σ 2 1 δ E ( t ) E ( t 1 ) E ∣ η ( t ) ( X Z ) − X ∣ 2 , Z ∼ N ( 0 , τ r ( t ) ) \begin{a…

京东秒杀之商品展示

1 在gitee上添加.yml文件 1.1 添加good-server.yml文件 server:port: 8084 spring:datasource:url: jdbc:mysql://localhost:3306/shop_goods?serverTimezoneGMT%2B8driverClassName: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourceusername: rootpa…

【JMeter】使用BeanShell写入内容到文件

一、前言 在我们日常工作中&#xff0c;可能会遇到需要将请求返回的数据写入到文件中。在我们使用JMeter进行性能测试时&#xff0c;就经常能够遇到这种情况。要想达到这种目的&#xff0c;我们一般采取BeanShell后置处理器来将内容写入到文件。 二、提取 在目前大多数的性能…

华为云CDN刷新与查询余量的Go实现及在Jenkins中的部署

引言 在华为云上&#xff0c;对CDN缓存内容进行刷新是一个常见的需求&#xff0c;以确保最新的内容能尽快被用户访问到。通过使用Go语言&#xff0c;我们可以开发一个自动化的工具来实现这一需求&#xff0c;并将其集成到Jenkins中以实现持续部署。下面我们将分步骤讲解如何实…

力扣hot100 和为 K 的子数组 前缀和

&#x1f468;‍&#x1f3eb; 题目地址 &#x1f37b; AC code class Solution {public int subarraySum(int[] nums, int k){int ans 0;int n nums.length;int[] s new int[n 1];// 前缀和s[0] 0;s[1] nums[0];for (int i 2; i < n; i)s[i] s[i - 1] nums[i - 1…

Termius 一款优秀的跨平台 SSH 客户端工具

&#x1f525;&#x1f525;&#x1f525; 作为程序员或者运维管理人员&#xff0c;我们经常需要使用终端工具来进行服务器管理及各种操作&#xff0c;比如部署项目、调试代码、查看/优化服务、管理服务器等。 而实现远程服务器连接需要借助 SSH 协议来进行&#xff0c;SSH&am…

Ubuntu知识积累

修改当前Ubuntu环境下时间 sudo date --set "2023-11-21 10:01:00"查看进程 过滤bs开头的进程 ps -aux|grep Bs查看ubuntu系统的磁盘大小 要查看Ubuntu系统的磁盘大小&#xff0c;可以使用df命令。df命令用于报告文件系统的磁盘空间使用情况&#xff0c;包括每个…

ESP32-Web-Server编程- JS 基础 4

ESP32-Web-Server编程- JS 基础 4 概述 HTML 内联事件处理器&#xff0c;你永远不应该使用 HTML 事件处理器属性——因为那些已经过时了&#xff0c;使用它们是不好的做法。 在前端编程中&#xff0c;除了将期望发生的事件写为 JS 文件外&#xff0c;还可以使用一些组件自带…

springboot+vue智能企业设备管理系统05k50

智能设备管理系统主要是为了提高工作人员的工作效率和更方便快捷的满足用户&#xff0c;更好存储所有数据信息及快速方便的检索功能&#xff0c;对系统的各个模块是通过许多今天的发达系统做出合理的分析来确定考虑用户的可操作性&#xff0c;遵循开发的系统优化的原则&#xf…

电子学会C/C++编程等级考试2021年12月(三级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:我家的门牌号 我家住在一条短胡同里,这条胡同的门牌号从1开始顺序编号。 若所有的门牌号之和减去我家门牌号的两倍,恰好等于n,求我家的门牌号及总共有多少家。 数据保证有唯一解。 时间限制:1000 内存限制:65536输入 一个…

艾森股份将上市在即:募资约6亿元,张兵、蔡卡敦夫妇为实控人

11月27日&#xff0c;江苏艾森半导体材料股份有限公司&#xff08;下称“艾森股份”&#xff0c;SH:688720&#xff09;开启申购&#xff0c;将在科创板上市。本次上市&#xff0c;艾森股份的发行价为28.03元/股&#xff0c;发行数量约2203万股&#xff0c;预计募资总额约6.18亿…

C++ :const修饰成员函数

常函数&#xff1a; 常函数&#xff1a; 成员函数后加const后我们称为这个函数为常函数 常函数内不可以修改成员属性 成员属性声明时加关键字mutable后&#xff0c;在常函数中依然可以修改 属性可修改&#xff1a; class Person { public: void showPerson() …

UI自动化测试工具有哪些优势?

UI自动化测试工具通过提高测试效率、覆盖率&#xff0c;减少测试时间和成本&#xff0c;以及支持持续集成等方式&#xff0c;为软件开发团队提供了一系列重要的优势&#xff0c;有助于提升软件质量和开发效率。 自动化执行&#xff1a;UI自动化测试工具可以模拟用户与应用程序的…

访问对象的方式

创建对象自然是为了后续使用该对象&#xff0c;我们的Java程序会通过栈上的reference数据来操作堆上的具体对象。由于reference类型在《Java虚拟机规范》里面只规定了它是一个指向对象的引用&#xff0c;并没有定义这个引用应该通过什么方式去定位、访问到堆中对象的具体位置&a…

C++:OJ练习(每日练习系列)

编程题&#xff1a; 题一&#xff1a;把字符串转换成整数 把字符串转换成整数_牛客题霸_牛客网 示例1 输入&#xff1a; "2147483647" 返回值&#xff1a; 2147483647思路一&#xff1a; 第一步&#xff1a;it从str的第一个字符开始遍历&#xff0c;定义一个最后输…