【发布时间】:2013-08-22 17:06:26
【问题描述】:
我有一个文件,其中包含一个文件名列表,我想在其中搜索一个单词并替换它 我稍微修改了代码只是为了在这里只显示相关部分 问题是,如果我在该列表中只有一个文件,它不会使用多线程处理它,因为只有当我有多个文件时线程才有效 所以我想保留当前的线程配置,但我想在处理部分添加一些线程 我有这个代码:
struct words_list {
char word[20];
struct words_list * next;
};
FILE * INFILE;
int num_thread = 10;
// Mutex variables
pthread_mutex_t input_queue;
pthread_mutex_t word_list;
int main(int argc,char **argv)
{
//some code is missing
if((INFILE = fopen(myfile,"r")) == NULL) {
fprintf(stderr,"Can't open input file\n");
exit(0);
}
for(i = 0 ; i < number_thread; i++)
{
if(pthread_create(&thread_id[i],NULL,&search,NULL) != 0)
{
i--;
fprintf(stderr,RED "\nError in creating thread\n" NONE);
}
}
for(i = 0 ; i < number_thread; i++)
if(pthread_join(thread_id[i],NULL) != 0)
{
fprintf(stderr,RED "\nError in joining thread\n" NONE);
}
fflush(INFILE);
fclose(INFILE);
}
void * search(void * data)
{
char file[20];
while (!feof(INFILE))
{
if (fgets(file,sizeof(file),INFILE) != NULL)
{
if (strlen(file) < 8)
break;
if (file[strlen (file) - 1] == '\n')
file[strlen (file) - 1] = '\0';
}
process(file);
}
return NULL;
}
void process(char *filename)
{
char buff[512];
char word[20];
struct words_list * curr_word = first_word;
if(verbose != 0)
fprintf(stderr,"Processing: %s\n",filename);
while(curr_word != NULL)
{
//some code missing
pthread_mutex_lock(&word_list);
strncpy(word,curr_word->word,sizeof(word) - 1);
pthread_mutex_unlock(&word_list);
**//replace_word must run with multiple threads**
ret = replace_word(word,buff,sizeof(buff));
//end of threads part
//code missing
}
}
如何在粗体部分添加其他 pthread,以便它可以处理每个文件的多个线程?
【问题讨论】:
-
与您在 main 中使用的代码类似的代码以什么方式失败?
-
我想要一些类似于我在 main 中使用的东西,但不知道如何添加它以避免一些混乱。
-
在您的文件列表中只有一个文件的情况下,是否要多线程处理文件?使用
process的当前实现将无法工作。你需要改变它。 :) -
是的,这就是我想要的。你能给我一些提示吗?