程序调用 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)
- 终止程序(它会自动刷新所有缓冲区)
#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)
- 终止程序(它会自动刷新所有缓冲区)