1

得られた結果のために、 pthread_join() 関数を理解するのに苦労しています。

pthread_join() が、指定されたスレッド ID のスレッドが終了するまで呼び出しスレッドを一時停止することになっている場合、次のコードが最初にスレッド 1を実行せず、次にスレッド 2を実行するのはなぜですか。それらは両方同時に起こっています。

(main から) 2 つの pthread_join() 行を取り出すと、プログラムは終了し、何も起こりません。これは、メイン スレッドが両方の結合関数の呼び出しプロセスであり、新しく作成された他の 2 つのスレッドが終了するのを待っているのはメイン スレッドであることを意味しますか?

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void *functionCount1();
void *functionCount2(void*);

int main()
{

    /* 
        How to Compile
         gcc -c foo
         gcc -pthread -o foo foo.o
    */

    printf("\n\n");

    int rc;
    pthread_t thread1, thread2;

    /* Create two thread --I took out error checking for clarity*/
    pthread_create( &thread1, NULL, &functionCount1, NULL)
    pthread_create( &thread2, NULL, &functionCount2, &thread1)

    pthread_join( thread1, NULL);
    pthread_join( thread2, NULL);

    printf("\n\n");
    exit(0);
}

void *functionCount1()
{

    printf("\nFunction 1");
        sleep(5);
    printf("\nFunction 1");

    return(NULL);
}

void *functionCount2(void* argument)
{

    //pthread_t* threadID = (pthread_t*) argument;

    //pthread_join(*threadID, NULL);

    printf("\nFunction 2");
        sleep(5);
    printf("\nFunction 2");

    return(NULL);
}

出力:

ここに画像の説明を入力

sleepコメントアウトした出力:

ここに画像の説明を入力

なぜ pthread_join がドキュメンテーションであなたが信じていることをしていないのか、誰か説明できますか?

4

1 に答える 1

3

指定されたスレッドIDのスレッドが終了するまでpthread_join()呼び出しプロセスを一時停止することになっている場合...

それはまったく正しくありません:は、呼び出し元のプロセスではなく、呼び出し元のスレッドpthread_join()を一時停止することになっています。関数を実行しているスレッドから呼び出しているため、他の 2 つのスレッドは同時に処理を進めることができます。pthread_join()main

コメントアウトしたコードが機能しない理由は、ポインタを に渡しているのに、スレッド実行関数内でpthread_tプレーンにキャストする(つまり、になる) ためです。この問題を修正すると、コードが期待どおりの結果を生成できるようになります。pthread_tpthread_t*pthread_t

void *functionCount2(void* argument)
{
    pthread_t *threadID = (pthread_t*) argument;
    pthread_join(*threadID, NULL);
    printf("\nFunction 2");
    sleep(5);
    printf("\nFunction 2");
    return(NULL);
}

さらに、同じターゲット スレッドを指定する複数の同時呼び出しの結果が未定義であるため、関数pthread_join( thread1, NULL);から削除する必要があります。mainpthread_join()

于 2014-11-12T19:01:19.270 に答える