簡體   English   中英

了解pthread_detach

[英]Understanding pthread_detach

以下打印

In Main()
Hello World
Hello World

為什么打印Hello World兩次? 如果我使用pthread_join(),則會發生所需的輸出(只有一個Hello World以In Main()開頭。

#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結束時終止它,一切都應該沒問題吧?

我在這里錯過了什么?

在我看來,你使用的是標准庫的非線程安全版本(print,fflush ...)。 我已經在舊的類Unix實時系統上看到過這種(顯然)非邏輯行為。 有兩個不同版本的std庫,一個用於單線程模式,另一個用於多線程模式。 當然,默認是單線程...通常,對文件指針和類似事物的訪問應該使用互斥鎖序列化。 在你的程序中有兩個線程終結點,每個終端可能想要隱式調用fflush,但由於底層緩沖區不是要同時訪問,因此可能會發生兩次刷新都將相同的數據寫入輸出文件描述符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM