C pthread_join分段错误

时间:2013-04-07 17:05:39

标签: c pthreads posix

我正在尝试编写一个C程序,它使用线程来计算目录树的大小。

当只有一个子目录时,我的代码工作正常,但每当我有2个或更多子目录时,我就会收到分段错误。我正在阅读很多关于它的内容,但是无法找到我的代码失败的原因。

在我的全球范围内:

pthread_mutex_t mutex;
int total_size = 0; // Global, to accumulate the size

主要():

int main(int argc, char *argv[])
{
    pthread_t thread;

    ...

    if (pthread_mutex_init(&mutex, NULL) < 0) 
    {
        perror("pthread_mutex_init");
        exit(1);
    }

    pthread_create(&thread, NULL, dirsize, (void*)dirpath);
    pthread_join(thread, NULL);

    printf("\nTotal size: %d\n\n", total_size);

...
}

我的 dirsize()功能:

void* dirsize(void* dir)
{
    ...

    pthread_t tid[100];
    int threads_created = 0;

    dp=opendir(dir);
    chdir(dir);

    // Loop over files in directory
    while ((entry = readdir(dp)) != NULL)
    {
        ...

        // Check if directory
        if (S_ISDIR(statbuf.st_mode))
        {
            // Create new thread & call itself recursively
            pthread_create(&tid[threads_created], NULL, dirsize, (void*)entry->d_name);
            threads_created++;
        }
        else
        {
            // Add filesize
            pthread_mutex_lock(&mutex);
            total_size += statbuf.st_size;
            pthread_mutex_unlock(&mutex);
        }
    }

    for (i = 0; i < threads_created; i++)
    {
        pthread_join(tid[i], NULL);
    }
}

我在这里做错了什么?如果你能指出我正确的方向,我将非常感激。

以下是我通过gdb获得的内容:http://pastebin.com/TUkHspHH

提前谢谢!

1 个答案:

答案 0 :(得分:4)

NUM_THREADS 的价值是多少?

    // Check if directory
    if (S_ISDIR(statbuf.st_mode))
    {
        // Create new thread & call itself recursively
        pthread_create(&tid[threads_created], NULL, dirsize, (void*)entry->d_name);
        threads_created++;
    }

在这里你应该检查 threads_created 是否等于 NUM_THREADS ,如果是这样的话,增加 tid 数组的大小(我会 malloc ,最后免费,顺便说一下。

此外,您应该在将其作为参数传递给线程之前分配目录名称的副本(malloc + strcpy),并在函数末尾而不是entry->d_name释放此类副本。