Author : STU_Lary
1. 实验说明
多线程实现单词统计工具
2. 解决方案
区分单词原则:凡是一个非字母或数字的字符跟在字母或数字的后面,那么这个字母或数字就是单词的结尾。
允许线程使用互斥锁来修改临界资源,确保线程间的同步与协作。如果两个线程需要安全地共享一个公共计数器,需要把公共计数器加锁。线程需要访问称为互斥锁的变量,它可以使线程间很好地合作,避免对于资源的访问冲突
3. 实验步骤
- 打开终端创建.c文件
终端输入 touch exp3.c
创建成功
- 对代码进行编写
- 生成可执行文件
终端输入 gcc exp3.c -o exp3 -lpthread
生成成功
4.创建两个含英文单词的txt文件
生成成功
- 在txt文件写点内容
- 执行文件
终端输入 ./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;
}