多线程实现单词统计工具的一段代码

时间:2021-06-02 06:33:43




//请教神牛:

//下面是多线程实现单词统计工具的一段代码

//如何修改好~



#include <stdio.h>
#include <pthread.h>
#include <ctype.h>

pthread_mutex_t counter_clock=PTHREAD_MUTEX_INITIALIZER;

int main(int ac,char *av[])
{
  void *count_words(void *);
  if(ac!=3)
  {
    printf("Usage:%s file1 file2\n",av[0]);
    exit(1);
  }
  /***********
  av[1],av[2] as parameter separatly and create thread t1,t2
  let t1 and t2 to wait 
  print the total number of the words
  *************/

  pthread_t tidp1,tidp2;
  int error1,error2;
  error1=pthread_create(&tidp1,NULL,count_words,av[1]);
  error2=pthread_create(&tidp2,NULL,count_words,av[2]);
  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_unclock(&counter_clock);
       } 
       prevc=c;
    }
    fclose(fp);
    printf("total_words=%d\n",&total_words);
  }else{
        perror(filename);
  }
  return NULL;
}
    

//本人是Linux下的一只小小小菜鸟,麻烦讲详细些~~

11 个解决方案

#1


哪里有问题你也不说,让人怎么帮你

#2


没看出来,哪里有问题呀。

#3


printf("total_words=%d\n",&total_words);

LZ这句话不对,去掉那个&,不知道你是不是打错了。
pthread_mutex_lock(&counter_clock);
  total_words++;
  pthread_mutex_unclock(&counter_clock);

如果LZ只是想计算每个文件中的单词数目,上述代码段中的加锁纯属多余。

#4


引用 3 楼 qq2623102025 的回复:
C/C++ code
printf("total_words=%d\n",&amp;total_words);


LZ这句话不对,去掉那个&amp;,不知道你是不是打错了。

C/C++ code
pthread_mutex_lock(&amp;counter_clock);
  total_words++;
  pthread_mutex_unclock(&amp;count……

要加&号,锁函数的原型是pthread_mutex_lock(pthread_mutex_t *)

#5


唉没有看出有啥问题,楼主说明一下吧

#6


(.text+0x55): undefined reference to `pthread_create'
(.text+0x81): undefined reference to `pthread_create'
(.text+0x99): undefined reference to `pthread_join'
(.text+0xad): undefined reference to `pthread_join'

#7



问题楼上的各位都已经说了,我就不多说一遍了,不过这边有个建议  楼主以后要贴代码最好是用插入的啊,这样格式比较好看,看起你的代码也比较轻松.....哈哈哈

#8


垃圾设计,根本不需要锁,各自统计完了返回主函数一个加和不就行了?

#9


引用 6 楼  的回复:
(.text+0x55): undefined reference to `pthread_create'
(.text+0x81): undefined reference to `pthread_create'
(.text+0x99): undefined reference to `pthread_join'
(.text+0xad): undefined reference to ……

编译的时候没有加-lpthread参数

#10


楼主是徐老师的学生吧,编译时按这个格式编 gcc thread.c -o thread -lpthread

#11


  int total_words=0;

这句放到所有函数之外,要不然多线程加锁就没用

#1


哪里有问题你也不说,让人怎么帮你

#2


没看出来,哪里有问题呀。

#3


printf("total_words=%d\n",&total_words);

LZ这句话不对,去掉那个&,不知道你是不是打错了。
pthread_mutex_lock(&counter_clock);
  total_words++;
  pthread_mutex_unclock(&counter_clock);

如果LZ只是想计算每个文件中的单词数目,上述代码段中的加锁纯属多余。

#4


引用 3 楼 qq2623102025 的回复:
C/C++ code
printf("total_words=%d\n",&amp;total_words);


LZ这句话不对,去掉那个&amp;,不知道你是不是打错了。

C/C++ code
pthread_mutex_lock(&amp;counter_clock);
  total_words++;
  pthread_mutex_unclock(&amp;count……

要加&号,锁函数的原型是pthread_mutex_lock(pthread_mutex_t *)

#5


唉没有看出有啥问题,楼主说明一下吧

#6


(.text+0x55): undefined reference to `pthread_create'
(.text+0x81): undefined reference to `pthread_create'
(.text+0x99): undefined reference to `pthread_join'
(.text+0xad): undefined reference to `pthread_join'

#7



问题楼上的各位都已经说了,我就不多说一遍了,不过这边有个建议  楼主以后要贴代码最好是用插入的啊,这样格式比较好看,看起你的代码也比较轻松.....哈哈哈

#8


垃圾设计,根本不需要锁,各自统计完了返回主函数一个加和不就行了?

#9


引用 6 楼  的回复:
(.text+0x55): undefined reference to `pthread_create'
(.text+0x81): undefined reference to `pthread_create'
(.text+0x99): undefined reference to `pthread_join'
(.text+0xad): undefined reference to ……

编译的时候没有加-lpthread参数

#10


楼主是徐老师的学生吧,编译时按这个格式编 gcc thread.c -o thread -lpthread

#11


  int total_words=0;

这句放到所有函数之外,要不然多线程加锁就没用