Linux操作系统实验 | 第二章 | 实验三 多线程实现单词统计工具

Author : STU_Lary

1. 实验说明

多线程实现单词统计工具

2. 解决方案

区分单词原则:凡是一个非字母或数字的字符跟在字母或数字的后面,那么这个字母或数字就是单词的结尾。
允许线程使用互斥锁来修改临界资源,确保线程间的同步与协作。如果两个线程需要安全地共享一个公共计数器,需要把公共计数器加锁。线程需要访问称为互斥锁的变量,它可以使线程间很好地合作,避免对于资源的访问冲突

3. 实验步骤

  1. 打开终端创建.c文件
终端输入 touch exp3.c

在这里插入图片描述

创建成功

在这里插入图片描述

  1. 对代码进行编写

  1. 生成可执行文件
终端输入 gcc exp3.c -o exp3 -lpthread

在这里插入图片描述

生成成功

在这里插入图片描述

4.创建两个含英文单词的txt文件

生成成功

在这里插入图片描述

  1. 在txt文件写点内容

在这里插入图片描述

在这里插入图片描述

  1. 执行文件
终端输入 ./exp3 ./word1.txt ./word2.txt

​ 输出结果如下图所示

4. 实验代码

#include <stdio.h>
#include <pthread.h>
#include <ctype.h>
#include <stdlib.h>
 
pthread_mutex_t counter_clock=PTHREAD_MUTEX_INITIALIZER;
 
 
int main(int ac,char *av[])
{
  void *count_words(void *);

  //如果参数个数不等于3个,则打印提示后退出
  if(ac!=3)
  {
    printf("Usage:%s file1 file2\n",av[0]);
    exit(1);
  }
 
 
  pthread_t tidp1,tidp2;
  int e1,e2;

  //创建两个线程tidp1 tidp2
  e1=pthread_create(&tidp1,NULL,count_words,av[1]);
  e2=pthread_create(&tidp2,NULL,count_words,av[2]);

  //让线程tidp1和tidp2进入等待态
  pthread_join(tidp1,NULL);
  pthread_join(tidp2,NULL);
  
  return 0;
}
 
void *count_words(void *f)
{
  char *filename=(char *)f;
  FILE *fp;
  int c,prevc='\0';
  int total_words=0;
 
  if((fp=fopen(filename,"r"))!=NULL){
    while((c=getc(fp))!=EOF)
    {
      if(!isalnum(c) && isalnum(prevc)){
         pthread_mutex_lock(&counter_clock);
         total_words++;
         pthread_mutex_unlock(&counter_clock);
       } 
       prevc=c;
    }
    fclose(fp);
    printf("total_words=%d\n",total_words);
  }else{
        perror(filename);
  }
  return NULL;
}
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值