一、要求及主要函数

  • 使用多线程,编写一个并行程序,将目录中的多个文件里的内容进行排序。
  • 文件内容格式为: <数字><空格><数字> 例如: 0 1 2 3 4 5 6 7 8
  • 定义全局变量存储给定目录下的多个(现假设有10个)文件的地址
  • 文件名从0到9,当前有两个线程, 0号线程排序0 2 4 6 8号文件, 1号线程排序1 3 5 7 9号文件

pthread_create

功能

  pthread_create是UNIX环境创建线程函数

函数原型

  int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict_attr,void*(*start_rtn)(void*),void *restrict arg);

  第一个参数为指向线程标识符的指针。

  第二个参数用来设置线程属性。

  第三个参数是线程运行函数的地址。

  最后一个参数是运行函数的参数。

返回值

  若成功则返回0,否则返回出错编号

pthread_join

功能

  函数pthread_join用来等待一个线程的结束。

函数原型

  extern int pthread_join __P (pthread_t __th, void **__thread_return);

  第一个参数为被等待的线程标识符

  第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。

注意

这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。如果执行成功,将返回0,如果失败则返回一个错误号。

这两函数的头文件为 #include<pthread.h>,在编译时需加上-lpthread参数,以调用静态链接库。因为pthread并非Linux系统的默认库。

二、主要代码

#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
static pthread_t id1,id2;
static char filePathList[10][100];//存放文件路径
//qsort比较器
int cmp(const void *a, const void *b) {return (*(int *)a - *(int *)b);
}
//线程1,排序0、2、4、6、8
void funOne(int thread_num) {printf("Thread: %d running...\n",thread_num);//先读取文件里内容后排序,最后覆盖写入FILE *fp;int index=0;//开始的文件下标while(index<10) {fp=fopen(filePathList[index],"r");//只读int t[1024];//存放读取的文件内容int i=0,j;printf("Thread %d 读取%d文件内容:\n",thread_num,index);while(fscanf(fp,"%d",&t[i])>0) {// 读取数字printf("%d ",t[i]);i++;}printf("\n");fclose(fp);qsort(t,i,sizeof(t[0]),cmp);//排序文件内容printf("Thread %d 排序后%d文件内容:\n",thread_num,index);fp=fopen(filePathList[index],"w");//覆写for(j=0; j<i; j++) {printf("%d ",t[j]);fprintf(fp,"%d ",t[j]);}printf("\n");fclose(fp);index+=2;//下一个文件下标}
}
//线程2排序 1、3、5、7、9
void funTwo(int thread_num) {printf("Thread: %d running...\n",thread_num);//先读取文件里内容后排序,最后覆盖写入FILE *fp;int index=1;//开始的文件下标while(index<10) {fp=fopen(filePathList[index],"r");//只读int t[1024];//存放读取的文件内容int i=0,j;printf("Thread %d 读取%d文件内容:\n",thread_num,index);while(fscanf(fp,"%d",&t[i])>0) {//读取数字printf("%d ",t[i]);i++;}printf("\n");fclose(fp);qsort(t,i,sizeof(t[0]),cmp);//排序文件内容printf("Thread %d 排序后%d文件内容:\n",thread_num,index);fp=fopen(filePathList[index],"w");//覆写for(j=0; j<i; j++) {printf("%d ",t[j]);fprintf(fp,"%d ",t[j]);}printf("\n");fclose(fp);index+=2;//下一个文件下标}
}int main() {char t[]= {"/home/kailang/pthread/2/"};//路径的公共部分int i,j;//拼接路径+文件名[0~9]for(j=0; j<10; j++) {for(i=0; t[i]!='\0'; i++) {filePathList[j][i]=t[i];}filePathList[j][i]=j+'0';//加上文件名filePathList[j][i+1]='\0';//以\0结束}//打印路径for(j=0; j<10; j++) {puts(filePathList[j]);}//创建线程if(pthread_create(&id1,NULL,(void *) funOne,0)!=0) {printf("pthread_create error!");return -1;}if(pthread_create(&id2,NULL,(void *) funTwo,1)!=0) {printf("pthread_create error!");return -1;}//等待线程执行结束pthread_join(id1,NULL);pthread_join(id2,NULL);return 0;
}

三、运行截图

首先需要10个要排序的文件,程序执行后会将排序好的内容覆盖掉原来的文件内容

多线程并发执行下,每次打印的信息不太一样,但最终保存到文件的排序结果是一样的 。

   

四、总结

该程序用到了存储路径的全局变量,而且每个线程处理的文件没有冲突,所以代码里不需要互斥锁或条件变量来实现。

Linux下C语言实现多线程排序文件内容相关推荐

  1. linux 修改文件内容sed,linux下通过sed命令直接修改文件内容

    linux下通过sed命令直接修改文件内容 sed是实现对流的编辑.通常,我们使用sed可以实现内容的编辑后然后保存成另外的一个文件,如果正确的话,才写入到源文件.但是某些时候,我们需要直接修改文件, ...

  2. 关于Linux下C语言开发基础的实验内容。

    Linux下C语言开发基础实验内容 目录 1.Linux下C语言开发流程 2.vi,vim编辑器的使用 3.Gcc编译器的使用 总体选项: 警告选项: 4.GDB 基本命令的使用 5.Make 工程管 ...

  3. Linux下C语言的系统头文件

    Linux菜鸟初看Linux下编程的糗事. 前段时间琢磨着接触一下Linux下的C语言编程,就找了本书看.看到很多文件操作的程序要包含"sys/stat.h". 写程序前,我想先找 ...

  4. linux下不解包查看tar包文件内容

    为减少日志文件占用的空间,很多情况下我们会将日志文件以天或周为周期打包成tar.gz 包保存.虽然这样做有利空间充分利用,但当我们想查看压缩包内的内容时确很不方便.如果只是一个tar.gz文件,可以将 ...

  5. linux如何查看tar的文件,linux下不解包查看tar包文件内容

    为减少日志文件占用的空间,很多情况下我们会将日志文件以天或周为周期打包成tar.gz 包保存.虽然这样做有利空间充分利用,但当我们想查看压缩包内的内容时确很不方便.如果只是一个tar.gz文件,可以将 ...

  6. Linux下c语言TCP多线程聊天室

    前言 开发环境:Linux(ubuntu 12.04),GCC 编译: gcc server.c -lpthread -std=gnu99 -o s gcc client.c -lpthread -s ...

  7. linux cat 查看文件内容 不带#号的,Linux下如何不用cat命令读取文件内容

    本文最后更新于2018年1月28日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢! =Start= 缘由: 在微信群里看到的一个讨论,觉得挺有启发意义的,所以在此整理一下,方便以后学习 ...

  8. 利用多线程实现linux下C语言的聊天室程序:

    转载:http://www.360doc.com/content/16/0421/11/478627_552531090.shtml 利用多线程实现linux下C语言的聊天室程序: 客户端代码: th ...

  9. copy文件的Linux程序代码,Linux下C语言实现CopyFile

    Linux下C语言实现文件拷贝 /* Function:copy file from file1 to file2 How to execute: ./copyfile file1 file2   ( ...

最新文章

  1. python venv windows7_安装 Python、pip 和 venv
  2. Linux中sort、uniq、cut、wc命令详解
  3. SQL点滴35—SQL语句中的exists
  4. [C++]头文件(Header Files)和命名空间(Namespace)
  5. jquery 下载 安装 浏览器支持
  6. 关系数据库设计理论--3NF
  7. 用手画了11张图终于搞明白了Git工作流,我怀疑你用的是假 Git
  8. 电脑连接热点无internet访问权限_Win10连接wifi后显示无internet访问权限如何解决...
  9. 网关、路由器、交换机
  10. 儿童学习与发展指南《倾听与表达》篇
  11. 小酷智慧地图3D导览v1.0.82 打卡定位 地图打卡
  12. COLMAP: Structure-from-Motion Revisited
  13. 聪明人的游戏提高篇:贝贝的数学课 (change)
  14. dell灵越笔记本后盖怎么拆_戴尔inspiron15 5547笔记本怎么拆机清灰?
  15. word2vec关键词提取 python_如何从word2vec的Google预训练模型中提取单词向量?
  16. 数据类型---原始数据类型
  17. 小米8青春版刷入Ubuntu Touch教程
  18. 基于JAVA高校体育场馆管理计算机毕业设计源码+数据库+lw文档+系统+部署
  19. 对于戴尔AWCC占用WMI Provider Host过多资源造成的随机性卡顿解决方法
  20. 《2013传智播客视频》-wmv,avi,mp4.目录

热门文章

  1. 数组18—push() :将一个或多个元素添加到数组的末尾
  2. vue 往数组中push对象
  3. VBA 连接Oracle 数据库
  4. cjson解析器说明
  5. VC++实现打开文件和打开所在文件夹的功能(附源码)
  6. Mybati从持久层到大气层
  7. 《规范》前端编码规范
  8. 【配色方案】可视化图表不知道怎么配色,来参考下顶尖公司的Logo配色方案~~
  9. 计算机制作画报说课稿,运用word图文混排制作海报说课稿
  10. 最简单的 Git 入门教程