【问题标题】:Where to join in multithreaded directory search?在哪里加入多线程目录搜索?
【发布时间】:2019-04-26 12:23:29
【问题描述】:

我一直在进行多线程目录搜索,每次运行到新目录或文件时都会创建一个线程。到目前为止,文件线程是并行的并且工作正常,但我不确定在哪里加入新的目录线程,因为它是递归的。我试过把它放在函数的底部,但它只是创建了一个循环(不是无限的,但肯定是错误的)

我的代码在下面,为了便于理解,我还有一个伪代码。

为了便于解释和清理杂乱的代码,这里是一个伪代码:

recursive function{
if (!(dir = opendir(ca->SD))){{
return;
}
while ((ptr = readdir(dir)) != NULL) {
    if (ptr->d_type == DT_DIR) { 
        if (strcmp(ptr->d_name, "..") == 0||strcmp(ptr->d_name, ".") == 0){
            continue;
        } 
        create thread/call recursive function
    }else(if file){
    create thread/call file handler function
    }
}
thread join for any live threads;
}

我只是对在哪里正确放置任何目录线程的连接感到困惑。我目前一直在循环。

【问题讨论】:

  • pthread_mutex_lock(&mutex); then if (pthread_self() == initialtid){...if 关闭后没有pthread_mutex_unlock(),但在if 语句中多次调用pthread_mutex_unlock() 本身就是灾难的根源。

标签: c multithreading recursion directory thread-safety


【解决方案1】:

我认为您不应该尝试创建未知数量的线程,因为它的性能会很差。在这种情况下,最好使用一个线程池,您可以在其中控制最大线程数,并且您不会为每个目录条目创建和销毁线程。

查看link 了解什么是线程池。

在您的示例中,您必须在每次递归调用结束时等待线程终止。我的意思是每次调用searchdirectory 都应该等待它创建的线程终止后再返回。

【讨论】:

  • 不幸的是,该项目的性质要求为每个目录创建一个线程,用于未知数量的目录,所以我无法这样做。
猜你喜欢
  • 1970-01-01
  • 2014-09-15
  • 2014-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-11
  • 1970-01-01
相关资源
最近更新 更多