//请教神牛:
//下面是多线程实现单词统计工具的一段代码
//如何修改好~
#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
要加&号,锁函数的原型是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'
(.text+0x81): undefined reference to `pthread_create'
(.text+0x99): undefined reference to `pthread_join'
(.text+0xad): undefined reference to `pthread_join'
#7
问题楼上的各位都已经说了,我就不多说一遍了,不过这边有个建议 楼主以后要贴代码最好是用插入的啊,这样格式比较好看,看起你的代码也比较轻松.....哈哈哈
#8
垃圾设计,根本不需要锁,各自统计完了返回主函数一个加和不就行了?
#9
编译的时候没有加-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
要加&号,锁函数的原型是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'
(.text+0x81): undefined reference to `pthread_create'
(.text+0x99): undefined reference to `pthread_join'
(.text+0xad): undefined reference to `pthread_join'
#7
问题楼上的各位都已经说了,我就不多说一遍了,不过这边有个建议 楼主以后要贴代码最好是用插入的啊,这样格式比较好看,看起你的代码也比较轻松.....哈哈哈
#8
垃圾设计,根本不需要锁,各自统计完了返回主函数一个加和不就行了?
#9
编译的时候没有加-lpthread参数
#10
楼主是徐老师的学生吧,编译时按这个格式编 gcc thread.c -o thread -lpthread
#11
int total_words=0;
这句放到所有函数之外,要不然多线程加锁就没用
这句放到所有函数之外,要不然多线程加锁就没用