3
#include <stdio.h>
#include "mythreads.h"
#include <stdlib.h>
#include <pthread.h>

void *
mythread(void *arg) {
    printf("%s\n", (char *) arg);
    return NULL;
}

int
main(int argc, char *argv[])
{
    if (argc != 1) {
        fprintf(stderr, "usage: main\n");
        exit(1);
    }

    pthread_t p1, p2;
    printf("main: begin\n");
    Pthread_create(&p1, NULL, mythread, "A");
    Pthread_create(&p2, NULL, mythread, "B");
    // join waits for the threads to finish
    //Pthread_join(p1, NULL); 
    //Pthread_join(p2, NULL); 
    printf("main: end\n");
    return 0;
}

これはRemzi Chapter 27 のコードです。いろいろ試してみると、なぜ実行時に A が 2 回出力されるのか知りたくなりました。join ステートメントを含めていないため、これが発生する理由はわかっています。結合をスキップすると、なぜこれが発生するのでしょうか?

私の出力:

shubham@HP:~/OS/Code-Threads-Intro$ ./a.out 
main: begin
A
main: end
B
shubham@HP:~/OS/Code-Threads-Intro$ ./a.out 
main: begin
A
main: end
B
shubham@HP:~/OS/Code-Threads-Intro$ ./a.out 
main: begin
main: end
A
shubham@HP:~/OS/Code-Threads-Intro$ ./a.out 
main: begin
main: end
B
A
A
4

1 に答える 1

0

呼び出しを削除しても、pthread_join()「A」が 2 回出力されることはありません。(実装にバグがない限り。)

ただし、fprintf()呼び出しは同じ構造を共有しているためFILE *、マルチスレッドセーフではない可能性があります。fprintf()「A」を 2 回出力する方法と理由は、システムの機能の実装の詳細に依存します。

于 2015-10-16T17:32:23.447 に答える