【Linux系统编程】【Google面试题改编】线程之间的同步与协调 Linux文件操作

编写程序,有四个线程1、2、3、4

线程1的功能就是输1,线程2的功能就是输出2,以此类推……现在有四个文件ABCD初始都为空

现要让四个文件呈如下格式:

    A: 1 22 333 4444 1 22 333 4444…

    B: 22 333 4444 1 22 333 4444 1…

    C: 333 4444 1 22 333 4444 1 22…

    D: 4444 1 22 333 4444 1 22 333…

Linux C写的代码实现结果 

Linux C代码 

#include <stdio.h>
#include <pthread.h>
#include <fcntl.h>
#include <unistd.h>int counter = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
char*files[]={"A", "B", "C", "D"};
int orders[4]={0,3,2,1};
int fds[4];
void *new(void *vptr) {int*p=(int*)vptr;int times=*p;for (int i = 0; i < 32; i++) {pthread_mutex_lock(&mutex); // 加锁while (counter%4 != times-1)pthread_cond_wait(&cond, &mutex);counter++;char buffer[16];for(int j=0;j<times;j++)buffer[j]=times+'0';buffer[times]=' ';write(fds[orders[(4-times+1+i)%4]],buffer,times+1);if(i==31)write(fds[orders[(4-times+1+i)%4]],"\n",1);pthread_cond_broadcast(&cond);pthread_mutex_unlock(&mutex); // 解锁}return NULL;
}int main(int argc, char **argv) {pthread_t threads[4];int times[4];for (int i = 0; i < 4; i++){times[i]=i+1;fds[i]=open(files[i],O_WRONLY|O_TRUNC);pthread_create(&threads[i], NULL, &new, &times[i]);}for (int i = 0; i < 4; i++)pthread_join(threads[i], NULL);pthread_mutex_destroy(&mutex); // 销毁互斥锁return 0;
}

 

首先创建四个空文件ABCD,要让四个线程协调工作需要用到互斥锁和条件变量,这里先声明初始化一下,并准备好四个文件的名字,orders等会解释用处,counter是用来计数区分四个线程的。

主函数创建了四个线程,需要让线程1打印一个1,线程2打印两个2,线程3打印3个3,线程4打印4个4,就需要向线程执行的函数传入一个参数来表示1234。这里使用了一个times数组而不是times整型变量,这是因为防止线程还没使用到正确的times值之前times又在下一次的循环中被修改了。打开四个文件准备写入,这里用的是只写和覆盖写。最后等待线程结束再退出。

在线程执行的函数中,先将指针转换为整型指针然后拿到整数的值,循环32次,这个循环次数无所谓,只是为了写多一点数据,每次循环中先加锁,然后判断counter和4取余是否等于打印*的次数减一,即判断是否轮到该线程输出,如果不是轮到该线程输出,那么该线程就进入等待,在某个线程输出完之后,counter++,同时唤醒所有等待线程并解锁。

然后接下来拼接出需要写入文件的字符串,然后最关键的地方来了,就是这个线程应该往哪个文件写这个字符串。

我们首先来观察一下我们需要达到的效果是怎么样的,首先得明白一个前提,即我们的线程是这样的:线程1打印一个1,线程2打印两个2,线程3打印3个3,线程4打印4个4。

那么线程1首先写文件A,完了写文件D,之后写文件C和文件D,从序数0开始计算的话,那么线程1写文件的顺序是这样的:0 3 2 1 0 3 2 1 0 3 2 1……

同时线程2写文件的顺序是这样的:1 0 3 2……,线程3写文件的顺序:2 1 0 3,线程4写文件的顺序:3 2 0 1,到这里就可以分析出来了,让一个数组int orders[4]={0,3,2,1},那么线程1写文件的顺序就是从第1个元素开始循环,而线程2写文件的顺序是从第4个元素开始循环,线程3写文件的顺序是从第3个元素开始循环,线程4写文件的顺序是从第2个元素开始循环,由此我们可以设计出代码实现。

编译运行程序,可见程序设计正确,成功按要求写入四个文件。

 怀疑我合起来输出造假,我再分开输出,合起来输出是为了好看和验证结果正确性。

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

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

相关文章

搭建react+ant design pro+umi 项目框架

一、 写本文的原因 我搭建reactantdumi这个框架的原始资料主要是来源于&#xff08;ReactUmi4从零快速搭建中后台系统保姆级记录教程&#xff08;一、项目创建及初始化&#xff09;&#xff09; 而我写这篇文章的本意就是用来记录我用搭建时候的步骤汇总。 二、 npm和node版…

Nginx快速入门:实现企业安全防护|nginx部署https,ssl证书(七)

0. 引言 之前我们讲到nginx的一大核心作用就是实现企业安全防护&#xff0c;而实现安全防护的原理就是通过部署https证书&#xff0c;以此实现参数加密访问&#xff0c;从而加强企业网站的安全能力。 nginx作为各类服务的统一入口&#xff0c;只需要在入口处部署一个证书&…

解决Maven找不到依赖的问题

如果经过Reload Maven项目&#xff0c;清除Idea缓存&#xff0c;甚至重启Idea等方法都解决不了Dependency xxx not found的问题&#xff0c;不妨试试手动安装。 1. 进入maven仓库&#xff0c;搜索自己需要的对应版本的依赖。 2. 点击下图红框jar图标下载对应的jar包&#xff0c…

【K8S基础】-k8s的核心概念控制器和调度器

Kubernetes是一个开源的容器编排平台&#xff0c;旨在简化和自动化容器化应用程序的部署、扩展和管理。它提供了一个强大的基础设施来管理容器化应用程序的生命周期&#xff0c;并确保它们在整个集群中高效运行。 Kubernetes的核心概念包括集群、节点、Pod、控制器、调度器等。…

lv13 环境搭建之内核编译 4

一、开发板运行Linux 1. 网线连接开发板和主机 2. ubuntu下拷贝uImage、exynos4412-fs4412.dtb两个文件到/tftpboot目录下cd ~/fs4412cp uImage exynos4412-fs4412.dtb /tftpboot 3. rootfs.tar.xz解压到/opt/4412sudo tar xvf rootfs.tar.xz -C /opt/4412sudo chmod 777 /opt…

软件测试面试八股文——基础篇

5&#xff09;错误推测法&#xff1a;是基于经验和直觉推测程序中所有可能存在的各种错误&#xff0c;从而有针对性的设计测试用例的方法 6&#xff09;正交实验法 7&#xff09;判定表法 8&#xff09;测试大纲法 3、提交缺陷的八大要素 1&#xff09;缺陷编号&#xff1a…

2023.12.24 关于 Redis 中 String 类型内部编码和应用场景

目录 String 类型内部编码 3 种内部编码方式 String 类型应用场景 Cache 缓存 键名命名规则 计数&#xff08;Counter&#xff09; 共享会话&#xff08;Session &#xff09; 手机验证码 总结 String 类型内部编码 3 种内部编码方式 int&#xff1a;用来表示 64 位 —…

智能优化算法应用:基于食肉植物算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于食肉植物算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于食肉植物算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.食肉植物算法4.实验参数设定5.算法结果6.…

详细学习Java注解Annotation、元注解(通俗易懂,一学就会)

概述 底层原理 自定义注解 示例代码&#xff1a; 1. 2.只有属性名为value的才可以&#xff0c;java对它进行了标识&#xff0c;如果是其他别名如value1是不行的 3.多个属性&#xff0c;必须用键值对形式&#xff0c;不能少写&#xff0c;也不能多写&#xff0c;除非有default修…

嵌入式中一文搞定C语言数据结构--跳表

大家好&#xff0c;今天分享一篇C语言数据结构相关的文章--跳表。 1. 什么是跳表 跳表是 链表 索引 的一种数据结构 &#xff0c;是以空间换取时间的方式&#xff0c;关于跳表参考: https://baike.baidu.com/item/跳表/22819833?fraladdin 2. 跳表概念 跳表在原有链表的基…

【算法】利用双指针法解决算法题(C++)

文章目录 1. 前言2. 双指针法引入283.移动零 3. 使用双指针法解决算法题1089.复写零202.快乐数11.盛最多水的容器[611.有效三角 形的个数](https://leetcode.cn/problems/valid-triangle-number/description/)LCR179.查找总价格为目标值的两个商品15.三数之和18.四数之和 1. 前…

redis基本用法学习(C#调用StackExchange.Redis操作redis)

StackExchange.Redis是基于C#的高性能通用redis操作客户端&#xff0c;也属于常用的redis客户端之一&#xff0c;本文学习其基本用法。   新建Winform项目&#xff0c;在Nuget包管理器中搜索并安装StackExchange.Redis&#xff0c;如下图所示&#xff1a;   StackExchange.…

开发利器——C语言必备实用第三方库

​ 对于广大C语言开发者来说&#xff0c;缺乏类似C STL和Boost的库会让开发受制于基础库的匮乏&#xff0c;也因此导致了开发效率的骤降。这也使得例如libevent这类事件库&#xff08;基础组件库&#xff09;一时间大红大紫。 今天&#xff0c;码哥给大家带来一款基础库&#…

JavaScript进阶(事件+获取元素+操作元素)

目录 事件基础 事件组成 执行事件的步骤 获取元素 根据ID获取元素 根据标签名获取元素 获取ol中的小li 类选择器&#xff08;html5新增的I9以上支持&#xff09; 获取body和html 操作元素 innerText和innerHtml 表单标签 样式属性操作 操作元素总结 事件基础 事…

JY901S 9轴姿态角度传感器模块

JY901S 9轴姿态角度传感器模块 JY901S 简介模块特性引脚说明IIC通讯IIC读写寄存器代码示例 JY901S 简介 模块集成高精度的陀螺仪、加速度计、地磁场传感器&#xff0c;采用高性能的微处理器和先进的动力学解算与卡尔曼动态滤波算法&#xff0c;能够快速求解出模块当前的实时运…

基于Python的新能源汽车销量分析与预测系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 基于Python的新能源汽车销量分析与预测系统是一个使用Python编程语言和Flask框架开发的系统。它可以帮助用户分析和预测新能源汽车的销量情况。该系统使用了关系数据库进行数据存储&#xff0c;并…

MATLAB信号处理与应用 读书笔记 一

完成了基本操作&#xff0c;今天组数也正常&#xff0c;需要对应解决fsctrl文件中的信号处理相关 重点关注4傅里叶变换&#xff0c;6FIR滤波器&#xff0c;10信号处理中的应用字符的链接[aa,bb]&#xff1b; N18;N216; n0:N-1;k10:N1-1;k20:N2-1; w2*pi*(0:2047)/2048; Xw(1-…

【并发设计模式】聊聊 基于Copy-on-Write模式下的CopyOnWriteArrayList

在并发编程领域&#xff0c;其实除了使用上一篇中的属性不可变。还有一种方式那就是针对读多写少的场景下。我们可以读不加锁&#xff0c;只针对于写操作进行加锁。本质上就是读写复制。读的直接读取&#xff0c;写的使用写一份数据的拷贝数据&#xff0c;然后进行写入。在将新…

CSS5 | CSS滑动门左扇与右扇图片重叠问题解决

本文中所使用的滑动门背景图片是自己用微软相册手工切的&#xff0c;没用ps&#xff0c;所以凑乎看吧 首先放出一张目标效果也是最终完成图 下面说问题 CSS推拉门原理 按原理来说&#xff0c;就是两个行内块前后站一行&#xff0c;然后前面的a标签和span标签分别是推拉门素材…

TCP 三次握手:四次挥手

TCP 三次握手/四次挥手 TCP 在传输之前会进行三次沟通&#xff0c;一般称为“三次握手”&#xff0c;传完数据断开的时候要进行四次沟通&#xff0c;一般称为“四次挥手”。 数据包说明 源端口号&#xff08; 16 位&#xff09;&#xff1a;它&#xff08;连同源主机 IP 地址…