程序调用 printf() 然后永远循环。为什么我看不到 printf 输出?

Program calls printf() then loops forever. Why don't I see the printf output?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <math.h>
  
struct my_Struct{
    int a;
    int b;
};
void *myThreadFun(void *received_struct)
{
    struct my_Struct *struct_ptr = (struct my_Struct*) received_struct;
    printf("%.1lf",pow(struct_ptr->a,struct_ptr->b));
    return NULL;
}
   
int main(int argc, char* argv[])
{
    struct my_Struct s;
    s.a = atoi(argv[1]);
    s.b = atoi(argv[2]);
    
    pthread_t thread_id;
    pthread_create(&thread_id, NULL, myThreadFun, &s);
    pthread_join(thread_id, NULL);
    while(1);
    exit(0);
}

为什么这段代码什么都不做?它应该在生成的线程中打印语句,然后进入无限循环。

使用gdb我们可以看到线程分叉成功

[New Thread 0x7ffff7a2d640 (LWP 8261)]
[Switching to Thread 0x7ffff7a2d640 (LWP 8261)]

Thread 2 "a.out" hit Breakpoint 1, myThreadFun (received_struct=0x7fffffffd960) at tmp.cpp:15

如果你删除 while(1) 你可以找到输出。输出延迟可能与 stdio 的缓冲区有关,while(1) 阻止缓冲区刷新。

您可以尝试另一种方法:在printf之后添加fflush(stdout);,效果相同。

这是因为 stdout 缓冲整行,所以这意味着它不会打印您的值,直到您执行以下三个操作之一:

  • \n 结束您的字符串:printf("%.1lf\n", ...)
  • 刷新 stdio 缓冲区:fflush(stdout)
  • 终止程序(它会自动刷新所有缓冲区)