1.13 多线程编程

news/2025/1/16 14:02:23/

1.思维导图

2.创建两个子进程,父进程负责:向文件中写入数据;两个子进程负责:从文件中读取数据。
        要求:一定保证1号子进程先读取,2号子进程后读取,使用文件IO去实现。

1>程序代码
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;// 打开文件,写入数据
void task1()
{int fd = open("t1.txt", O_CREAT | O_RDWR | O_TRUNC, 0666);if (fd == -1){perror("open");return;}char buf[60] = "Hello world!";write(fd, buf, sizeof(buf));close(fd);
}// 读取数据
void task2()
{int fd = open("t1.txt", O_RDONLY);lseek(fd, 0, SEEK_SET);char buf[60] = {0};int res;while ((res = read(fd, buf, 1)) > 0){// 打印读取的字节putchar(buf[0]);}close(fd);
}int main(int argc, const char *argv[])
{// 创建第一个子进程pid_t pid1 = fork();if (pid1 == 0){sleep(1);task2();printf("\n1号子进程读取数据成功!\n");}else if (pid1 > 0){// 创建第二个子进程pid_t pid2 = fork();if (pid2 == 0){sleep(2);task2();printf("\n2号子进程读取数据成功!\n");}else if (pid2 > 0){// 父进程的操作task1();wait(0);wait(0);}}return 0;
}
2>运行结果

3.创建一个线程(结果为1个主线程和1个分支线程),主线程负责:输入三角形的三条边长;分支线程负责:计算三角形的面积(海伦公式)。
        注意:使用sqrt函数编译的时候需要在编译的最后加上 -lm。

1>程序代码
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>
#include <math.h>typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;typedef struct Triangle
{double a;double b;double c;
}Tri,*TriPtr;void* thread_main(void* arg)
{TriPtr tri = (TriPtr)arg;double s = (tri->a + tri->b + tri->c)/2;double area = sqrt(s*(s-(tri->a))*(s-(tri->b))*(s-(tri->c)));printf("这个三角形的面积为:%.2lf\n",area);free(tri);
}int main(int argc, const char *argv[])
{TriPtr tri = (TriPtr)malloc(sizeof(Tri));printf("请输入三角形的三条边:");scanf("%lf%lf%lf",&(tri->a),&(tri->b),&(tri->c));pthread_t id;pthread_create(&id,0,thread_main,(void*) tri);pthread_join(id,NULL);free(tri);return 0;
}
2>运行结果


http://www.ppmy.cn/news/1563614.html

相关文章

【Uniapp-Vue3】showLoading加载和showModal模态框示例

一、showLoading加载 uni.showLoading({ title:"标题", // 其他配置 }); uni.hideLoading(); showLoading开启后不会自动关闭&#xff0c;只能手动配置uni.hideLoading() 来关闭加载框。 二、showModel模态框 uni.showModel({ title:"标题", // 其他配置 …

Prompt工程框架介绍与场景选择

文章目录 Prompt工程框架介绍1. CREATE框架2. RACE框架3. RISE框架4. ROSES框架5. E.R.A框架6. SAGE框架7. CARE框架8. PEAR框架9. TIER框架10. LEAP框架11. DEEP框架12. WISE框架13. FOCUS框架14. CLEAR框架15. SMART框架16. CLEAR框架17. LEAN框架18. BRIEF框架19. FAST框架2…

PL/SQL语言的网络编程

PL/SQL语言的网络编程 引言 随着信息技术的迅猛发展&#xff0c;数据库技术在企业信息化建设中的地位愈发重要。PL/SQL作为Oracle数据库的重要扩展语言&#xff0c;不仅可以在数据库内部进行复杂的业务逻辑处理&#xff0c;还可以通过网络编程实现与外部系统的交互。在这篇文…

纯 Python、Django、FastAPI、Flask、Pyramid、Jupyter、dbt 解析和差异分析

一、纯 Python 1.1 基础概念 Python 是一种高级、通用、解释型的编程语言&#xff0c;以其简洁易读的语法和丰富的标准库而闻名。“纯 Python” 在这里指的是不依赖特定的 Web 框架或数据分析工具&#xff0c;仅使用 Python 原生的功能和标准库来开发应用程序或执行任务。 1.…

深度解析Linux中关于操作系统的知识点

操作系统概述与核心概念 任何计算机系统都包含一个基本的程序集合&#xff0c;成为操作系统OS 操作系统是一款进行软硬件管理的软件 操作系统包括&#xff1a; 内核&#xff08;进程管理&#xff0c;内存管理&#xff0c;驱动管理&#xff09; 其他程序&#xff08;例如数据…

如何编写优秀的测试用例?

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、测试点与测试用例 测试点不等于测试用例&#xff0c;这是我们首先需要认识到的。 问题1&#xff1a;这些测试点在内容上有重复&#xff0c;存在冗余。 问题…

3、C#基于.net framework的应用开发实战编程 - 实现(三、一) - 编程手把手系列文章...

三、 实现&#xff1b; 三&#xff0e;一、实现数据库操作&#xff1b; 对于数据库的操作&#xff0c;以前都是有ODBC的接口&#xff0c;通过Helper类库进行的操作。此文主要介绍例子里对数据库操作的实现。 1、 SQLiteHelper&#xff1b; SQLite主要是用C编写的&#xff0c;但…

【element plus】虚拟dom表格中cellRenderer如何使用v-for循环渲染item

在Element Plus中&#xff0c;cellRenderer 通常用于自定义表格&#xff08;el-table&#xff09;中单元格的渲染方式。然而&#xff0c;cellRenderer 本身并不直接支持 Vue 的 v-for 指令&#xff0c;因为 cellRenderer 是一个函数&#xff0c;它接收单元格的数据和其他上下文…