1

私は次のコードを与える本を読みました:

void *printme(void *id) {
    int *i;
    i = (int *)id;
    printf("Hi. I'm thread %d\n", *i);
    return NULL;
}

void main() {
    int i, vals[4];
    pthread_t tids[4];
    void *retval;
    for (i = 0; i < 4; i++) {
        vals[i] = i;
        pthread_create(tids+i, NULL, printme, vals+i);
    }
    for (i = 0; i < 4; i++) {
        printf("Trying to join with tid%d\n", i);
        pthread_join(tids[i], &retval);
        printf("Joined with tid%d\n", i);
    }
}

そして次の可能な出力:

Trying to join with tid0 
Hi. I'm thread 0 
Hi. I'm thread 1 
Hi. I'm thread 2 
Hi. I'm thread 3 
Joined with tid0 
Trying to join with tid1 
Joined with tid1 
Trying to join with tid2 
Joined with tid2 
Trying to join with tid3 
Joined with tid3

そして、私はそれがどのように可能であるかを理解していません。メイン スレッドから始めて、4 つのスレッドを作成しますtids[0]... tids[3]。次に、(join 命令によって) 実行を一時停止します。メイン スレッドはtids[0]、実行を停止するtids[0]まで待機し、待機tids[1]します。

したがって、出力は次のようになります。

Hi. I'm thread 0 
Hi. I'm thread 1 
Hi. I'm thread 2 
Hi. I'm thread 3 
Trying to join with tid0 
Trying to join with tid1 
Joined with tid0 
Trying to join with tid2 
Joined with tid1 
Trying to join with tid3 
Joined with tid2 
Joined with tid3

本当に基本的なことを理解していないように感じます。ありがとう。

4

2 に答える 2

2

あなたが見逃しているのは、それがとpthread_createは非常に異なるということだと思いますfork。作成されたスレッドは、指定された関数(printmeこの場合は)で開始し、その関数が戻るとすぐに終了します。したがって、新しく作成されたスレッドはいずれも2番目のforループに到達しません。

于 2012-05-18T21:27:14.690 に答える
2

新しいスレッドpthread_createを作成すると、スレッド#1とメインの両方が並行して機能します。Mainはphtread_joinである次の命令に進み、スレッド#1が終了するまでハングします。これが、tid0に参加しようとしている理由です。それでは、こんにちは、スレッド#1です。

また、メインスレッドは指定された順序で子スレッドに参加することに注意してください。つまり、スレッド#1、スレッド#2、スレッド#3があり、スレッド1の実行に10秒、スレッド2の実行に6秒、スレッド3の実行に7秒かかる場合、最初の結合は10秒後に行われます。他のすべてのスレッドはジョブを終了する必要があるため、数秒後に数ミリ秒で次の結合が必要になります。

于 2012-05-18T21:25:31.240 に答える