c - Pthread I/O 缓冲区 : Why doese it print a redundant line?

标签 c pthreads buffer

#include "apue.h"                                                               
#include <limits.h>
#include <pthread.h>


void* fun(void *arg)
{
    printf("%lu: I'm alive\n", pthread_self());
    pthread_exit(0);
}

int main(int argc, char **v)
{
    pthread_t tid;
    pthread_create(&tid, NULL, fun, NULL);
    printf("%lu: I'm dead\n", pthread_self());

    return 0;
}


$ ./a.out
3075692224: I'm dead
3075689280: I'm alive
3075689280: I'm alive

$ ./a.out
3076470464: I'm dead

有时,它会打印一行。 我认为 一行:3076470464:我死了 或者 两行:

3075692224: I'm dead
3075689280: I'm alive

应该是正确的。 因为我不使用pthread_join但是为什么它可以打印三行;

最佳答案

您观察了对共享资源的无保护并发访问的奥秘,在这种情况下是缓冲的 stdout

使用互斥锁保护 stdout 免受并发访问,一切都会按预期工作:一个 printf() 语句将匹配一个打印行。

但是,您的程序存在 main() 在线程结束之前退出的风险,因此结束程序可能会在随机位置销毁线程。

关于c - Pthread I/O 缓冲区 : Why doese it print a redundant line?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22240523/

相关文章:

c - 在 .m 文件中访问作为全局变量的结构

c++ - 为什么线程过程应该是静态的或成员函数

c - 初始化线程池

c# - 如何在C#中有效地在桌面上绘图?

apache - apache tomcat 中的奇怪临时文件夹

c++ - 如何操作字符数组

c - 使用 setjmp 和 longjmp

C:家庭作业中美元/美分的舍入和输出格式

c - 尝试将 Haskell 函数导出到 C 时出现元组 "cannot be marshalled in a foreign call"

linker - LLVM 将 pthread 函数调用插入 IR