【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.hqwc.cn/news/299791.html

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

相关文章

分类预测 | Matlab实现SCSO-SVM基于沙猫群优化算法优化支持向量机的多变量分类预测【23年新算法】

分类预测 | Matlab实现SCSO-SVM基于沙猫群优化算法优化支持向量机的多变量分类预测【23年新算法】 目录 分类预测 | Matlab实现SCSO-SVM基于沙猫群优化算法优化支持向量机的多变量分类预测【23年新算法】分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现SCSO-…

【C++】STL 容器 - list 双向链表容器 ① ( 容器特点 | 容器操作时间复杂度 | 构造函数 )

文章目录 一、 list 双向链表容器简介1、容器特点2、容器操作时间复杂度3、遍历访问5、头文件 二、 list 双向链表容器 构造函数1、默认无参构造函数2、创建包含 n 个相同元素的 list 双向链表3、使用初始化列表构造 list 双向链表4、使用另外一个 list 容器 构造 list 双向链表…

Ascon加解密算法分析

参数定义 加密架构图 整个过程是在处理320bits的数据&#xff0c;所以在最开始需要对原始的数据进行一个初始化&#xff0c;获得320bits的数据块&#xff0c; 图里看到的pa和pb都是在做置换&#xff08;对320bits的数据进行一个置换&#xff09; 置换&#xff08;Permutation&…

智能优化算法应用:基于人工蜂鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码

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

C++11特性:线程同步之条件变量

条件变量是C11提供的另外一种用于等待的同步机制&#xff0c;它能阻塞一个或多个线程&#xff0c;直到收到另外一个线程发出的通知或者超时时&#xff0c;才会唤醒当前阻塞的线程。条件变量需要和互斥量配合起来使用&#xff0c;C11提供了两种条件变量&#xff1a; 1. conditi…

[Linux] MySQL数据库之事务

一、事务的概念 事务就是一组数据库操作序列&#xff08;包含一个或者多个 SQL 操作命令&#xff09;&#xff0c;事务会把所有 操作看作是一个不可分割的整体向数据库系统提交或撤消操作&#xff0c;所有操作要么都执行&#xff0c;要么都不执行。 事务是一种机制、一个操作序…

每日一题——LeetCode160.相交链表

个人主页&#xff1a;白日依山璟 专栏&#xff1a;Java|数据结构与算法|每日一题 文章目录 1. 题目描述示例1&#xff1a;示例2&#xff1a;提示&#xff1a; 2. 思路3. 代码 1. 题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的…

[pyqt5]QSpinBox相关函数

1.QSpinBox简介 QSpinBox是计数器控件&#xff0c;允许用户输入整数&#xff0c;或者通过上下按键递增或者递减&#xff0c;默认调整范围是0-99&#xff0c;每次变化步数1&#xff0c;用户可以自行修改范围和步数&#xff1b; QSpinBox常用方法如下&#xff1a; QSpinBox信号…

【LeetCode刷题笔记】动态规划(二)

647. 回文子串 解题思路: 1. 暴力穷举 , i 遍历 [0, N) , j 遍历 [i+1, N] ,判断每一个子串 s[i, j) 是否是回文串,判断是否是回文串可以采用 对撞指针 的方法。如果是回文串就计数 +1

入门级:用devEco Studio创建一个鸿蒙APP

文章概叙 本文主要讲的是如何在鸿蒙的开发工具devEco Studio新建一个项目&#xff0c;全文很水&#xff0c;只适合新手!! 开始贴图 假设当前你已经下载好了devEco Studio,但是还没正式开始安装&#xff0c;此时你点击安装包&#xff0c;你会发下如下页面&#xff0c;只需要点…

C预处理 | pragma详解

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

【知识点随笔分享 | 第九篇】常见的限流算法

目录 前言&#xff1a; 1.固定窗口限流&#xff1a; 缺点&#xff1a; 2.滑动窗口限流&#xff1a; 优点&#xff1a; 滴桶限流&#xff1a; 缺点&#xff1a; 令牌桶限流&#xff1a; 优点&#xff1a; 总结: 前言&#xff1a; 当今互联网时代&#xff0c;随着网络…