Понимание pthread_detach

Следующие отпечатки

In Main()
Hello World
Hello World

Почему эта печать дважды Hello World? Если я использую pthread_join(), вы получите нужный результат (только один мир Hello превзошел 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, все должно быть в порядке?

Что мне здесь не хватает?

Ответ 1

По-моему, вы используете небезобезопасную версию стандартной библиотеки (prints, fflush...). Я уже видел это (по-видимому) нелогичное поведение в старой системе, подобной системе UNIX. Были две разные версии библиотеки std, одна для однопоточного и одна для многопоточных. Конечно, значение по умолчанию было однопоточным... В общем, обращения к указателям на файлы и аналогичным вещам должны быть сериализованы с помощью взаимных обозначений. В вашей программе есть два конца потока, каждый из которых может потребовать неявное выражение fflush, но поскольку базовые буферы не предназначены для одновременного доступа, может случиться так, что обе списания записывают одни и те же данные в дескриптор выходного файла.