调试C中的递归线程调用
在过去的一天半时间里,每当我有空的时候,我都在试着调试我的代码,我不知道我的代码出了什么问题。当我将调试C中的递归线程调用,c,multithreading,directory,C,Multithreading,Directory,在过去的一天半时间里,每当我有空的时候,我都在试着调试我的代码,我不知道我的代码出了什么问题。当我将close()函数添加到递归调用时,程序会给我一个无效指针。但是,当我删除close()函数调用时,程序运行正常,只是它没有执行它应该执行的操作,即: 将用户中的所有文件大小相加 输入目录 打开子目录(如果有),然后添加 把里面的所有文件都整理好 子目录 相反,它将输入目录中的所有文件大小相加,并能够打开最后一个子目录,将该目录中的文件添加到总文件大小计数中 我正在尝试用线程来实现这一点。ma
close()
函数添加到递归调用时,程序会给我一个无效指针。但是,当我删除close()
函数调用时,程序运行正常,只是它没有执行它应该执行的操作,即:
- 将用户中的所有文件大小相加 输入目录
- 打开子目录(如果有),然后添加 把里面的所有文件都整理好 子目录
main()
函数从用户输入目录创建一个主线程,并立即运行opendirectory()
/*
* Iterates through given directory
*/
void *opendirectory(void *t)
{
pthread_mutex_lock(&dirlock);
DIR *dpntr;
struct dirent *dentry;
char new_directory[512], dir = t;
printf("OPENING DIRECTORY ... %s\n", t);
/* Checks if given directory can be opened */
if((dpntr = opendir(t)) == NULL) {
printf("DIRECTORY FAILED ...%s\n",t);
perror("ERROR -- COULD NOT OPEN DIR");
pthread_exit(NULL);
}
printf("DIRECTORY OPENED: %s\n", t);
/* Read each file in current directory */
while ((dentry = readdir(dpntr)) != NULL ) {
/* Ignore special directories */
if(strcmp(dentry -> d_name, ".") == 0 || strcmp(dentry -> d_name, "..") == 0) {
continue;
} else {
compilelist( t, dentry->d_name );
}
}
pthread_mutex_unlock(&dirlock);
/* Checks if directory can be closed */
if(closedir(dpntr) < 0)
printf("ERROR CLOSING %s.\n", t);
}
这是main()
我觉得在compilelist()
函数底部调用的pthread\u create()
工作不正常。threads[]指的是默认大小为20的全局线程数组,假设总共不超过20个目录。由于用户的输入目录,dirCount从1开始,并随着遇到新目录而增加。第一个问题:
过去一天半我有空的时候
不要那样做,你的大脑不是为它而建的。分配时间,告诉你的同事/妻子和孩子,如果他们在这段时间打扰你,会有枪声和警察介入:-)
其他问题:不知道(因此是社区wiki)。您的代码:
dpntr = opendir(t)
if(closedir(t)<0)
应该是:
if(closedir(dpntr) < 0)
if(closedir(dpntr)<0)
在这里,我发现您的代码有两个问题:
在修复了以上2点之后,到目前为止,它在我的FC9 x86_64上运行良好。顺便说一句:线程数20是不够的。如果你想得到这方面的帮助,你必须提供完整的源代码(dPtr声明在哪里?dir=t是错误的,等等)。你能将代码发布到main()吗?或者至少你在哪里设置线程属性/处理连接/等等?我会在一点时间内编辑我的帖子,但当我在想一种方法使其递归时,我将我的大部分变量设置为全局变量。。。可能是一个非常新手的错误,但任何指点都将是伟大的!我正在将一些指针从全局改为本地。有一件事需要注意,@Kenji(我认为这不是你的具体问题)。粗略地看一眼,我看不出有什么东西能阻止主线程在你的子线程有机会使用它之前(通过dPtr指针)更改文件路径名。我想你可能发现了什么,我正在尝试将一些全局变量切换到局部变量,并准备重新编译…@Kenji,在这种情况下,我倾向于使用一个受互斥保护的标志变量。主线程在创建子线程之前将其设置为1,然后循环直到其为0。子线程将相关数据(数据,而不是指向数据的指针)复制到本地存储,然后将其设置为0并继续。这保证了每个线程都不会踩在另一个线程上。。。谢谢这是一个我严重忽视的简单错误,应该仔细检查一下!我已经更改了它,但当我在笔记本电脑上运行该程序时,仍然会出现分段错误。目前似乎无法通过ssh连接到Linux系统进行测试…将立即为closedir()编辑post,忘记在上次编辑中更新它。我一定会检查Char PrimePalthNo[ 512 ]用法,并考虑如何着手。谢谢。好的,我相信我已经正确地设置了使用动态分配,但是我仍然在没有打开子目录的线程上遇到错误。我将在稍后发布我的新代码。我不应该释放(文件路径名)吗?我想我必须这样做,才能正确地为递归调用malloc…1。在线程opendirectory()中释放它。2.如果是第1点,则也在main中执行动态alloc。3.不要忘记在其他分支上释放它,例如!ISDIR()和opendir()失败,等等。Hrm。。。也许只有我一个人,但在我没有空闲(filepathname)时,它似乎可以工作,而且在我的情况下,它可以在较小的目录上正常工作。。。谢谢你的帮助!
pthread_mutex_t mutex;
pthread_mutex_t dirlock;
pthread_mutex_t filelock;
pthread_mutex_t dircountlock;
pthread_mutex_t threadlock;
pthread_cond_t count_threshold_cv;
pthread_attr_t attr;
pthread_t threads[128]; // handles up to 128 threads (i.e. 128 directories, change accordingly)
char directory[512];
int dirSize = 0;
int dirCount = 1; // user's input directory
dpntr = opendir(t)
if(closedir(t) < 0)
if(closedir(dpntr) < 0)