0

割り当て用のスレッドを使用してディレクトリ ツリーのサイズを計算する C プログラムを作成しようとしています。

サブディレクトリが 1 つしかない場合はコードが正常に動作しますが、サブディレクトリが 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

前もって感謝します!

4

1 に答える 1

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配列のサイズを大きくする必要があります(関数 begin でmallocし、最後に解放します)。

さらに、引数としてスレッドに渡す前にディレクトリ名のコピー (malloc + strcpy) を割り当て、関数の最後でそのようなコピーを解放する必要がありますentry->d_name

于 2013-04-07T17:16:41.347 に答える