3

OS コースの試験科目で見つけたこの小さなプログラムがあります。

void * func (void * p) {
    int n = p;
    printf("%d \n",n);
    return NULL;
}

int main() {
    int i;
    pthread_t t[3];
    for(i=0; i<3; i+=1)
        pthread_create(&t[i] ,NULL, func, (void*)i);
    return 0;
}

実行すると、次の結果が得られます (各桁の後に新しい行があります)。

1回目:0 0
2回目:1 0 2 2
3回目:0 1 1

スレッドを 3 つしか作成しないのに 4 桁が出力されるのはなぜですか。また、どうすれば複製を印刷できますか?

コードは Ubuntu の gcc でコンパイルされます。

端末のスクリーンショット

4

2 に答える 2

7

main() を終了する前にスレッドに参加しません。以下を に追加しますmain()

for(i=0; i<3; i+=1)
    pthread_join(t[i], NULL);

スレッドを結合しないと、プログラムの終了中にスレッドが実行され続けると、未定義の動作が発生します。未定義の動作は、複製の印刷を含め、自由に行うことができます。

このように考えてくださいvoid*。スレッドに渡された はどこかに保存され、途中で main を終了すると、スレッドに渡すデータを破壊する可能性があり、その時点で任意の値 (重複したものを含む) を取ることができます。しかし、これは未定義の動作であるため、説明する価値さえありません。

于 2013-01-27T23:40:48.170 に答える
2

returnmain関数からの呼び出しexitは、プロセス全体を呼び出して終了するのと同じです。したがって、どの出力が画面に表示されるかは多かれ少なかれランダムです。次のいずれかを実行する必要があります

  • 作成したすべてのスレッドに参加する
  • 呼び出すか使用する代わりにpthread_exitの最後に呼び出すmainexitreturn
于 2013-01-27T23:45:05.960 に答える