我是线程新手,我相信我理解这个概念。由于锁是使用线程的必要工具,但是(或者至少对我来说)如何使用它会让我感到困惑,我需要使用它们,但似乎无法使它们正确。这里的想法是搜索目录以查找CSV文件。 (将在CSV上完成更多的工作,但这里没有关系)我有一个算法来搜索没有使用线程的工作正常的目录。 (请记住,搜索目录是一种非常适合递归的任务,因为您需要搜索目录以查找另一个目录,当您找到要搜索该目录的新目录时)因为我需要使用线程在每个查找新目录的实例上,我都设置了两次相同的算法。一旦进入main,它找到目录并调用一个函数(通过线程)来搜索找到的目录。同样,如果我在没有线程的情况下使用这个方法,我没有问题,但是使用线程,我发送给函数的参数将被覆盖。即使我锁定整个功能,也会发生这种情况。很明显,我没有正确使用锁和线程,但我出错的地方就是我。我有测试目录来验证它是否(或不是)正常工作。我在"。"中有3个目录。目录,然后超过该目录的子目录。它找到前三个目录(在main中)然后当它将它们传递给线程函数时,它将搜索三个不同的时间,但通常不止一次搜索同一目录。换句话说,路径名称似乎被覆盖。我会发布代码,以便您可以看到我正在做的事情。我提前谢谢你。完整代码的链接:sorter.h https://pastebin.com/0vQZbrmh sorter.c https://pastebin.com/9wd8aa74 dirWorker.c https://pastebin.com/Jd4i1ecr
在sorter.h中
#define MAXTHREAD 255
extern pthread_mutex_t lock;
typedef
struct _dir_proc
{
char* path; //the path to the new found directory
char* colName; //related to the other work that must be done
} dir_proc;
在sorter.c中
#include <pthread.h>
#include <assert.h>
#include <dirent.h>
#include "sorter.h"
pthread_mutex_t lock;
int main(int argc, char* argv[])
{
int err = 0;
pthread_t threads[MAXTHREAD];
DIR *dirPointer;
char* searchedDirectory = ".";
struct dirent *directEntry;
dir_proc *dir_proc_args = malloc(sizeof(struct _dir_proc));
assert(dir_proc_args != NULL);
dir_proc_args->path = (char*) malloc(256 * (sizeof(char));
assert(dir_proc_args->path != NULL);
dir_proc_args->colName = (char*) malloc(256 * sizeof(char));
assert(dir_proc_args->colName != NULL);
pthread_mutex_init(&lock, NULL)
//dir_proc_args->colName is saved here
if(!(dirPointer = opendir(searchedDirectory)))
{
fprintf(stderr, "opening of directory has failed");
exit(1);
}
while((directEntry = readdir(dirPointer)) != NULL)
{
//do stuff here to ensure it is a directory
//ensure that the dir we are looking at is not current or parent dir
//copy path of found directory to dir_proc_args->path
err = pthread_create(&threads[count++], NULL, &CSVFinder, (void*)dir_proc_args);
if(err != 0)
printf("can't create thread);
}
int i;
for(i=0; i < count; ++i)
{
pthread_join(threads[i], NULL);
}
pthread_mutex_destroy(&lock);
}
CSVFinder函数中的
#include <assert.h>
#include <pthread.h>
#include "sorter.h"
#include <dirent.h>
void *CSVFinder(void *args)
{
pthread_mutex_lock(&lock); //I have locked the entire function to see I can get it to work. this makes no sense to actually do
DIR *dirPointer;
struct dirent *directEntry;
dir_proc *funcArgs = (struct _dir_proc*)args;
char path[255];
strncpy(path, funcArgs->path, sizeof(path));
if(!(dirPointer = opendir(funcArgs->path)))
{
fprintf(stderr, "opening of directory has failed");
exit(1);
}
while((directEntry = readdir(dirPointer)) != NULL)
{
if(directEntry->d_type == DT_DIR) //if we are looking at a directory
{
//make sure the dir we are looking at is not current or parent dir
snprintf(funcArgs->path, (sizeof(path) + sizeof(directEntry->d_name)), "%s/%s", path, directEntry->d_name);
//I would like to be able to do a recursive call here
//to search for more directories but one thing at a time
}
}
closedir(dirPointer);
pthread_mutex_unlock(&lock);
return(NULL);
}
我希望我没有遗漏任何相关的代码。我试图将代码保持在最低限度,同时不留下任何必要的内容。
答案 0 :(得分:0)
我不清楚为什么要创建一个简单遍历目录结构的线程。但是,我会指出我看到的一些问题。
一个小问题是你在CSVFinder函数中,你调用readder,而不是readdir。
但对我来说一个明显的问题是你没有在main或CSVFinder()函数中初始化dirPointer。我希望看到像
这样的电话dirPointer = opendir(&#34; /&#34;);
在while循环之前的main()函数中。
然后我希望看到CSVFinder()通过调用opendir(path)来初始化它的dirPointer,其中path是主循环中找到的子目录的名称。
有关如何遍历目录结构的详细参考,请转到此处...