使用线程和互斥锁来搜索目录

时间:2017-11-26 20:13:05

标签: c multithreading mutex locks

我是线程新手,我相信我理解这个概念。由于锁是使用线程的必要工具,但是(或者至少对我来说)如何使用它会让我感到困惑,我需要使用它们,但似乎无法使它们正确。这里的想法是搜索目录以查找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);
}

我希望我没有遗漏任何相关的代码。我试图将代码保持在最低限度,同时不留下任何必要的内容。

1 个答案:

答案 0 :(得分:0)

我不清楚为什么要创建一个简单遍历目录结构的线程。但是,我会指出我看到的一些问题。

一个小问题是你在CSVFinder函数中,你调用readder,而不是readdir。

但对我来说一个明显的问题是你没有在main或CSVFinder()函数中初始化dirPointer。我希望看到像

这样的电话

dirPointer = opendir(&#34; /&#34;);

在while循环之前的main()函数中

然后我希望看到CSVFinder()通过调用opendir(path)来初始化它的dirPointer,其中path是主循环中找到的子目录的名称。

有关如何遍历目录结构的详细参考,请转到此处...

https://www.lemoda.net/c/recursive-directory/