多线程 - 比单线程慢

时间:2017-10-15 20:57:51

标签: c multithreading mutex

当我使用多个线程而不是单个线程运行我的程序时,它会变慢,是不是应该更快?程序应该从开始目录开始遍历所有目录,并查找并打印所有名为X的文件。下面是代码:

while(!done) {
        pthread_mutex_lock(&lock);
        if(!list_isEmpty(dirList)) {
            DIR *dir;
            struct dirent *d;
            char *folder;

            folder = strdup(list_inspect(1, dirList));
            list_remove(list_inspect(1,dirList), dirList);
            if(folder == NULL) {
                perror("failed strdup on path\n");
                pthread_mutex_unlock(&lock);
                continue;
            }
            pthread_mutex_unlock(&lock);
            dir = opendir(folder);
            if(dir == NULL) {
                perror(folder);
                free(folder);
                continue;
            }
            while ((d = readdir(dir)) != NULL) {
                if(strcmp(d->d_name, ".")==0 || strcmp(d->d_name, "..")==0) {
                    continue;
                }
                searchBasedOnType(folder, info, d);
            }
            closedir(dir);
            free(folder);
        }
        else {
            if(sleepCounter == info->nrthr-1) {
                done = true;
                pthread_cond_broadcast(&cond);
                pthread_mutex_unlock(&lock);
                break;
            }
            else {
                sleepCounter++;
                pthread_cond_wait(&cond, &lock);
                sleepCounter--;
                pthread_mutex_unlock(&lock);                
            }
        }   
    }

以下是使用互斥锁等函数searchBasedOnTypes调用函数的示例:

char currentPath[FILENAME_MAX];
        struct stat buf;

        strcpy(currentPath,f);
        if(currentPath[strlen(currentPath)-1] != '/') {
            strcat(currentPath, "/");
        }
        strcat(currentPath, d->d_name);
        if(lstat(currentPath, &buf) == -1){
          perror(currentPath);
          return;
        }

        if(S_ISDIR(buf.st_mode)) {
            pthread_mutex_lock(&lock);
            char *newDir = malloc(sizeof(currentPath));
            if(newDir == NULL) {
                perror("Failed allocating memory for path\n");
                pthread_mutex_unlock(&lock);
                return;
            }
            strcpy(newDir, currentPath);
            printf("insert %s\n", newDir);
            list_insert(newDir, dirList);
            printf("done\n");
            pthread_cond_signal(&cond);
            pthread_mutex_unlock(&lock);
        }
        if(strcmp(name,d->d_name) == 0) {
            printf("%s\n",currentPath);
        }

当有多个线程运行并且可能是解决方案时,有人可以帮我找到可能会降低程序速度的程序吗?感谢您提前获得所有帮助和建议!

1 个答案:

答案 0 :(得分:3)

人们经常将线程与培根的计算等价(使一切变得更好)。

实际上:多线程并不总能加快速度。如果您的线程正在访问可以并行处理的不同硬件资源,则多个线程通常只会加快速度。在不共享内存(或很少共享内存)的两个不同内核上运行CPU绑定任务的两个线程可能会更快。如果他们共享内存或击中相同的磁盘,他们很有可能会争夺。

由于磁盘是目前程序正在处理的最慢的资源,所以我并不感到惊讶你没有看到任何加速。尝试使用多个磁盘(每个磁盘一个线程)进行相同的实验,您可能会看到一个改进。

此外,程序具有的同步性(互斥锁)通常具有的并行性越低。因此,性能将进一步受到影响。