0511_IO6

练习1:

 1:有一个隧道,全长5公里,有2列火车,全长200米,
                火车A时速 100公里每小时
                火车B时速 50公里每小时
                现在要求模拟火车反复通过隧道的场景(不可能2列火车都在隧道内运行)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.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>
void *train_A(void *arg);
void *train_B(void *arg);
int tunnel_long=5000;//定义全局变量隧道长度5000m
int train_long=200;//定义全局变量火车长度200m
pthread_mutex_t mutex;//互斥锁
pthread_cond_t cond;//条件变量
int main(int argc, const char *argv[])
{pthread_cond_init(&cond,0);pthread_mutex_init(&mutex,0);pthread_t thread_one;pthread_t thread_two;if(pthread_create(&thread_one,0,train_A,0)!=0){perror("线程创建失败");return -1;}if(pthread_create(&thread_two,0,train_B,0)!=0){perror("线程创建失败");return -1;}if(pthread_detach(thread_one)!=0){perror("线程分离失败");return -1;}if(pthread_detach(thread_two)!=0){perror("线程分离失败");return -1;}while(1){pthread_cond_signal(&cond);}return 0;
}
void * train_A(void *arg){while(1){pthread_mutex_lock(&mutex);pthread_cond_wait(&cond,&mutex);float train_speed=100*1000/3600.0;//火车A的s速度int sumlong=train_long+tunnel_long;//火车A需要走过的长度unsigned int train_time=sumlong/train_speed;printf("火车A正在通过中\n");usleep(train_time*1000000);printf("火车A已经通过\n");pthread_mutex_unlock(&mutex);}
}
void * train_B(void *arg){while(1){pthread_mutex_lock(&mutex);pthread_cond_wait(&cond,&mutex);float train_speed=50*1000/3600.0;//火车B的s速度int sumlong=train_long+tunnel_long;//火车B需要走过的长度unsigned int train_time=sumlong/train_speed;printf("火车B正在通过中\n");usleep(train_time*1000000);printf("火车B已经通过\n");pthread_mutex_unlock(&mutex);}
}

练习2: 

   2:有一个隧道,全长5公里,有3列火车,全长200米,
                火车A时速 100公里每小时
                火车B时速 50公里每小时
                火车c时速 25公里每小时
                现在要求 火车A先通过隧道,火车B再通过隧道,最后火车C通过隧道

 #include <stdio.h>#include <string.h>#include <stdlib.h>#include <sys/types.h>#include <unistd.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>pthread_mutex_t mutex; // 互斥锁pthread_cond_t cond_a; // 火车A的条件变量pthread_cond_t cond_b; // 火车B的条件变量pthread_cond_t cond_c; // 火车C的条件变量int turn = 0; // 共享状态变量,表示轮到哪一辆火车                                                                                                                                  int tunnel_long=5000;//定义全局变量隧道长度5000mint train_long=200;//定义全局变量火车长度200mvoid *train_A(void *arg);void *train_B(void *arg);void *train_C(void *arg);int main(int argc, const char *argv[]) {pthread_mutex_init(&mutex, NULL);pthread_cond_init(&cond_a, NULL);pthread_cond_init(&cond_b, NULL);pthread_cond_init(&cond_c, NULL);pthread_t thread_a, thread_b, thread_c;if(pthread_create(&thread_a, 0, train_A, 0)!=0){perror("线程创建失败");return -1;}if(pthread_create(&thread_b, 0, train_B, 0)!=0){perror("线程创建失败");return -1;}if(pthread_create(&thread_c, 0, train_C, 0)!=0){perror("线程创建失败");return -1;}pthread_join(thread_a, NULL);pthread_join(thread_b, NULL);pthread_join(thread_c, NULL);pthread_mutex_destroy(&mutex);pthread_cond_destroy(&cond_a);pthread_cond_destroy(&cond_b);pthread_cond_destroy(&cond_c);return 0;}void *train_A(void *arg) {while (1) {pthread_mutex_lock(&mutex);while (turn != 0) {pthread_cond_wait(&cond_a, &mutex); // 等待轮到自己}//火车A通过隧道float train_speed=10000*1000/3600.0;//火车A的s速度int sumlong=train_long+tunnel_long;//火车A需要走过的长度float travel_time = sumlong / train_speed;printf("火车A正在通过隧道\n");usleep((int)(travel_time * 1000000));printf("火车A已经通过隧道\n");// 轮到火车B,并发出信号turn = 1;pthread_cond_signal(&cond_b);pthread_mutex_unlock(&mutex);}}void *train_B(void *arg) {while (1) {pthread_mutex_lock(&mutex);while (turn != 1) {pthread_cond_wait(&cond_b, &mutex); // 等待轮到自己}// 火车B通过隧道float train_speed=10000*1000/3600.0;//火车B的s速度int sumlong=train_long+tunnel_long;//火车B需要走过的长度float travel_time = sumlong / train_speed;printf("火车B正在通过隧道\n");usleep((int)(travel_time * 1000000));printf("火车B已经通过隧道\n");// 轮到火车C,并发出信号turn = 2;pthread_cond_signal(&cond_c);pthread_mutex_unlock(&mutex);}}void *train_C(void *arg) {while (1) {pthread_mutex_lock(&mutex);while (turn != 2) {pthread_cond_wait(&cond_c, &mutex); // 等待轮到自己}// 火车C通过隧道float train_speed=10000*1000/3600.0;//火车C的s速度int sumlong=train_long+tunnel_long;//火车C需要走过的长度float travel_time = sumlong / train_speed;printf("火车C正在通过隧道\n");usleep((int)(travel_time * 1000000));printf("火车C已经通过隧道\n");// 轮回到火车A,并发出信号turn = 0;pthread_cond_signal(&cond_a);pthread_mutex_unlock(&mutex);}}

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

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

相关文章

力扣 516. 最长回文子序列 python AC

动态规划 class Solution:def longestPalindromeSubseq(self, s):size len(s)dp [[0] * size for _ in range(size)]for i in range(size):dp[i][i] 1for i in range(size - 1, -1, -1):for j in range(i 1, size):if s[i] s[j]:dp[i][j] dp[i 1][j - 1] 2else:dp[i][…

第四届上海理工大学程序设计全国挑战赛 J.上学 题解 DFS 容斥

上学 题目描述 usst 小学里有 n 名学生&#xff0c;他们分别居住在 n 个地点&#xff0c;第 i 名学生居住在第 i 个地点&#xff0c;这些地点由 n−1 条双向道路连接&#xff0c;保证任意两个地点之间可以通过若干条双向道路抵达。学校则位于另外的第 0 个地点&#xff0c;第…

python格式化显示复杂对象例如字典

当想格式化显示一个字典&#xff0c;并且希望通过日志记录输出时&#xff0c;Python 提供了几种方法来实现这一目标。这里有两种常用的方式来格式化显示字典内容&#xff1a; 1 使用 format 方法直接格式化 你可以直接使用 format 方法将字典转换为字符串&#xff0c;这种方法…

动态绑定和静态绑定

在C中&#xff0c;绑定&#xff08;Binding&#xff09;通常指的是将函数名&#xff08;或其他标识符&#xff09;与其实现&#xff08;或值&#xff09;关联起来的过程。这可以发生在编译时&#xff08;静态绑定&#xff09;或运行时&#xff08;动态绑定&#xff09;。以下是…

python多标签图像分类的图片相册共享交流系统vue+django

建立图片共享系统&#xff0c;进一步提高用户对图片共享信息的查询。帮助用户和管理员提高工作效率&#xff0c;实现信息查询的自动化。使用本系统可以轻松快捷的为用户提供他们想要得到的图片共享信息。 根据本系统的基本设计思路&#xff0c;本系统在设计方面前台采用了pytho…

区块链中MEV攻击:危害与防护策略

MEV攻击科普&#xff1a;揭秘、危害与防护策略 什么是MEV攻击及危害 在加密货币和区块链的世界里&#xff0c;MEV&#xff08;最大化提取价值&#xff0c;Maximal Extractable Value&#xff09;攻击是一种日益受到关注的现象&#xff0c;它涉及交易者、矿工或验证者利用信息…

Python 数据处理 合并二维数组和 DataFrame 中特定列的值

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 示例代码如下&#xff1a; import numpy as np import pandas as pddata {label: [1, 2, 3, 4]} df pd.DataFrame(data)values_array df[["label"]].values random_array np.random.ran…

Star15.3k,开源数据可视化分析工具项目

好东西来了&#xff0c;这是一个人人可用的开源数据可视化分析工具项目&#xff0c;V 哥迫不及待的要给大家推荐这个项目&#xff0c;帆软、Tableau 等商业 BI 工具的开源替代&#xff0c;已在 Github 上被 Star了15.3k了&#xff0c;大家一起来了解一下。自己搭建起来可用&…

Svelte框架:编译时优化的高性能前端框架

Svelte是一款新兴的前端框架&#xff0c;以其独特的编译时优化机制著称&#xff0c;能够在构建时将复杂的UI逻辑转换为高效的JavaScript代码&#xff0c;从而实现高性能的Web应用。本文将深入解析Svelte的架构、核心概念以及代码优化策略。 2024年礼包&#xff1a;2500G计算机…

【Git】Git在Gitee上的基本操作指南

文章目录 1. 查看 git 版本2. 从Gitee克隆仓库&#xff1a;3. 复制文件到工作目录&#xff1a;4. 将未跟踪的文件添加到暂存区&#xff1a;5. 在本地提交更改&#xff1a;6. 将更改推送到远程仓库&#xff08;Gitee&#xff09;&#xff1a;7. Windows特定提示&#xff1a; 1. …

2024.5.12每日一题

LeetCode 吃掉N个橘子的最少天数 题目链接&#xff1a;1553. 吃掉 N 个橘子的最少天数 - 力扣&#xff08;LeetCode&#xff09; 题目描述 厨房里总共有 n 个橘子&#xff0c;你决定每一天选择如下方式之一吃这些橘子&#xff1a; 吃掉一个橘子。如果剩余橘子数 n 能被 2 …

数智化浪潮下,透视中建信息的“生态底色”

数智化浪潮正滚滚来袭&#xff0c;成为强劲的经济引擎。 根据国家统计局最新披露的数据&#xff0c;2023年中国数字经济核心产业增加值估计会超过12万亿元&#xff0c;占GDP比重10%左右。 对于众多企业而言&#xff0c;眼下思考的已经不是要不要布局数智化&#xff0c;而是如…

一个人结婚生娃后,就成熟了

文|洪生鹏 大家好&#xff0c;我是老洪。 今日偶然瞥见一个引人深思的话题——你认为成熟的标志是什么&#xff1f; 这个话题如同一股清泉&#xff0c;瞬间激起了我心中的波澜&#xff0c;让我忍不住想和大家分享一些个人的感悟。 青春&#xff0c;如同一首欢快的歌&#xff0c…

Golang | Leetcode Golang题解之第85题最大矩形

题目&#xff1a; 题解&#xff1a; func maximalRectangle(matrix [][]byte) (ans int) {if len(matrix) 0 {return}m, n : len(matrix), len(matrix[0])left : make([][]int, m)for i, row : range matrix {left[i] make([]int, n)for j, v : range row {if v 0 {continu…

Disk Map for Mac,让您的Mac更“轻”松

还在为Mac磁盘空间不足而烦恼吗&#xff1f;Disk Map for Mac来帮您轻松解决&#xff01;通过独特的TreeMap视觉显示技术&#xff0c;让您一眼就能看出哪些文件和文件夹占用了大量空间。只需简单几步操作&#xff0c;即可快速释放磁盘空间&#xff0c;让您的Mac更“轻”松。快来…

整体安全设计

人员和资产的安全是当今许多组织的最高优先事项之一。随着暴力事件在美国各地盛行——枪击事件、袭击、内乱等——建筑物业主必须为其建筑物及其居住者的安全做好计划。 为了创造一个安全的环境&#xff0c;新设施或园区的安全设计必须超越基本的摄像头和访问控制设备&#xf…

图鸟UI vue3:基于Vue3和UniApp的酷炫简洁UI框架

引言 随着前端技术的不断发展&#xff0c;开发效率和用户体验成为了前端开发中的两大关键因素。为了提高开发效率和提供更好的用户体验&#xff0c;各种UI框架应运而生。其中&#xff0c;TuniaoUI作为一款基于Vue3和UniApp开发的UI组件库&#xff0c;以其酷炫简洁的设计和丰富…

如何通过iptables配置URL过滤黑名单?

正文共&#xff1a;1555 字 16 图&#xff0c;预估阅读时间&#xff1a;2 分钟 我们前面曾经简单介绍过URL过滤功能&#xff08;URL过滤功能了解一下&#xff1f;&#xff09;&#xff0c;并且以H3C VFW为例简单配置了一下URL过滤功能。 首先回顾一下&#xff0c;URL过滤&#…

头歌C语言数据结构(队列的应用)

第1关&#xff1a;循环队列 任务描述 本关任务&#xff1a;编写一个循环队列&#xff0c;实现入队、出队操作&#xff0c;判断队空、队满等特殊情况。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.循环队列定义&#xff0c;2.入队、出队的定义&#xff…

深入理解C++中的Vector容器:用容器构建高效程序

文章目录 vector介绍vector常用的成员函数有关vector定义的函数vector的迭代器使用vector关于空间操作的成员函数vector的增删查改 总结 vector介绍 在C语言的库中包含有公共数据结构的实现&#xff0c;C的这个部分内容就是众所周知的STL&#xff08;标准模版库&#xff09;&a…