12

以下のプリント

In Main()
Hello World
Hello World

Hello World が 2 回出力されるのはなぜですか? pthread_join() を使用すると、目的の出力が発生します (In Main() が先行する Hello World は 1 つだけです)。

#include <pthread.h>

void *thread_func(void *arg);

int main(int argc, char **argv)
{
    int s;
    void *res;
    pthread_t t1;

    s = pthread_create(&t1, NULL, thread_func, "Hello World\n");

    if (s != 0)
        printf("Err\n");

    printf("In Main()\n");

    s = pthread_detach(t1);

    if (s != 0)
        printf("Err\n");

    return 0;
}

void *thread_func(void *arg)
{
    char *s = (char *)arg;
    printf("%s", s);
    pthread_exit(0);
}

pthread_detach は、スレッドが終了すると、pthread によって使用されるすべてのリソースを解放するようにライブラリに指示することを理解しています...そして、thread_func の最後で終了するので、すべて問題ないはずですよね?

ここで何が欠けていますか?

4

1 に答える 1

3

私の意見では、標準ライブラリの非スレッドセーフ バージョン (prints、fflush...) を使用しています。古い UNIX ライクなリアルタイム システムで、この種の (明らかに) 非論理的な動作を既に見てきました。std ライブラリには、シングルスレッド モード用とマルチスレッド モード用の 2 つの異なるバージョンがありました。もちろん、デフォルトはシングル スレッドでした... 一般に、ファイル ポインタなどへのアクセスはミューテックスでシリアル化する必要があります。プログラムには 2 つのスレッド終了があり、それぞれが暗黙的に fflush を呼び出したい場合がありますが、基礎となるバッファーは同時にアクセスされることを意図していないため、両方のフラッシュが同じデータを出力ファイル記述子に書き込む可能性があります。

于 2012-11-10T08:34:53.370 に答える