我正在做我的功课,我要完成的是计算给定目录的目录和文件,但是我发现每个目录都应该与我的过程的另一个线程一起计数,这就是我到目前为止有:加入线程混淆
void *dirCounter(void *param){
queue<pthread_t> queue;
dir_ptr dir = (dir_ptr)param;
dir->countDir = 0;
DIR* dirName = dir->name;
struct dirent *curr;
off_t dsp;
dsp= telldir(dirName);
while(dsp!= -1){
curr = readdir(dirName);
if(curr == NULL){
break;
}
if(!strcmp(curr->d_name,".")|!strcmp(curr->d_name,"..")) { //To avoid counting . and ..
dsp = telldir(dirName); //Actual position asociated to the stream
continue; //Executes the beginning of the while
}
if(curr->d_type == DT_DIR){
dir->countDir++; //counts directories in the first level
//For each directory found, create another thread and add it to the queue:
pthread_attr_t attr1;
pthread_t tid1;
pthread_attr_init(&attr1);
dir_ptr par1 = (dir_ptr)malloc(sizeof(directorio));
par1->name = opendir(curr->d_name);
par1->countDir = par1->countFile = 0;
pthread_create(&tid1,&attr1, dirCounter, par1);
//queue.push(tid1);
}
if(curr->d_type == DT_REG){
dir->countFile++; //Counts files
}
dsp = telldir(dirName);
}
//pthread_join(tid1, NULL);
//while(!queue.empty()){
//pthread_join(queue.front(), NULL);
// queue.pop();
//}
printf("Dirs: %d Files: %d\n", dir->countDir, dir->countFile);
pthread_exit(NULL);
}
到目前为止的代码不计数的“第一级”的当前文件和显示目录,如果加入的注释,然后它只是给分段错误,如果该行注释掉它给只是一条输出线,然后随着分段故障而死亡。 想法是创建一个线程,每当我找到一个目录,然后加入所有他们在最后创建一个半递归的例程。
修改:
char str[256];
strcpy(str, "./");
strcat(str, curr->d_name);
//strcat(str, "\"");
puts(str);
par1->name = opendir(str);
par1->countDir = par1->countFile = 0;
pthread_create(&tid1,&attr1, dirCounter, par1);
queue.push(tid1);
修改后做些什么: 打印所有的目录,但它确实给分段错误,某些线程没有完成它的任务。
非常有用,但是我无法进行此修改,但是我接受了这个想法并对代码进行了一些更改,现在我的原始帖子在“修改”标题下:) – 2012-03-21 16:14:02