c语言坑之printf缓冲区

 1 #include <stdio.h>
 2 #include <pthread.h>
 3 #include <semaphore.h>
 4 #include <unistd.h>
 5 #define MAXSTACK 100
 6 int stack[MAXSTACK][2];
 7 int size = 0;
 8 sem_t sem;
 9 /* 从文件1.dat读取数据,每读一次,信号量加一*/
10 void* ReadData1(void*)
11 {
12     FILE *fp = fopen("1.dat", "r");
13     if (fp == NULL) 
14     {
15         printf("open 1.dat failed!");
16         return NULL;
17     }
18     while (!feof(fp))
19     {
20         fscanf(fp, "%d%d", &stack[size][0], &stack[size][1]);
21         sem_post(&sem);
22         ++size;
23     }
24     fclose(fp);
25 }
26 /*从文件2.dat读取数据*/
27 void* ReadData2(void*)
28 {
29     FILE *fp = fopen("2.dat", "r");
30     if (fp == NULL) 
31     {
32         printf("open 2.dat failed!");
33         return NULL;
34     }
35     while (!feof(fp))
36     {
37         fscanf(fp, "%d%d", &stack[size][0], &stack[size][1]);
38         sem_post(&sem);
39         ++size;
40     }
41     fclose(fp);
42 }
43 /*阻塞等待缓冲区有数据,读取数据后,释放空间,继续等待*/
44 void *HandleData1(void *)
45 {
46     while (1)
47     {
48         if (sem_trywait(&sem)<0) continue;
49         printf("Plus:%d+%d=%dn", stack[size][0], stack[size][1],stack[size][0] + stack[size][1]);
50         --size;
51     }
52 }
53 
54 void *HandleData2(void*)
55 {
56     while (1)
57     {
58         sem_wait(&sem);
59         printf("Multiply:%d*%d=%dn", stack[size][0], stack[size][1],stack[size][0] * stack[size][1]);
60         --size;
61     }
62 }
63 int main(void)
64 {
65     pthread_t t1, t2, t3, t4;
66     sem_init(&sem, 0, 0);
67     pthread_create(&t1, NULL, HandleData1, NULL);
68     pthread_create(&t2, NULL, HandleData2, NULL);
69     pthread_create(&t3, NULL, ReadData1, NULL);
70     pthread_create(&t4, NULL, ReadData2, NULL);
71     //usleep(1000);
72     //fflush(stdout);
73     /* 防止程序过早退出,让它在此无限期等待*/
74     pthread_join(t1, NULL);
75 }
printf没输出
 1 #include <stdio.h>
 2 #include <pthread.h>
 3 #include <semaphore.h>
 4 #include <unistd.h>
 5 #define MAXSTACK 100
 6 int stack[MAXSTACK][2];
 7 int size = 0;
 8 sem_t sem;
 9 /* 从文件1.dat读取数据,每读一次,信号量加一*/
10 void* ReadData1(void*)
11 {
12     FILE *fp = fopen("1.dat", "r");
13     if (fp == NULL) 
14     {
15         printf("open 1.dat failed!");
16         return NULL;
17     }
18     while (!feof(fp))
19     {
20         fscanf(fp, "%d%d", &stack[size][0], &stack[size][1]);
21         sem_post(&sem);
22         ++size;
23     }
24     fclose(fp);
25 }
26 /*从文件2.dat读取数据*/
27 void* ReadData2(void*)
28 {
29     FILE *fp = fopen("2.dat", "r");
30     if (fp == NULL) 
31     {
32         printf("open 2.dat failed!");
33         return NULL;
34     }
35     while (!feof(fp))
36     {
37         fscanf(fp, "%d%d", &stack[size][0], &stack[size][1]);
38         sem_post(&sem);
39         ++size;
40     }
41     fclose(fp);
42 }
43 /*阻塞等待缓冲区有数据,读取数据后,释放空间,继续等待*/
44 void *HandleData1(void *)
45 {
46     while (1)
47     {
48         //if (sem_trywait(&sem)<0) continue;
49         sem_wait(&sem);
50         printf("Plus:%d+%d=%d\n", stack[size][0], stack[size][1],stack[size][0] + stack[size][1]);
51         --size;
52     }
53 }
54 
55 void *HandleData2(void*)
56 {
57     while (1)
58     {
59         sem_wait(&sem);
60         printf("Multiply:%d*%d=%d\n", stack[size][0], stack[size][1],stack[size][0] * stack[size][1]);
61         --size;
62     }
63 }
64 int main(void)
65 {
66     pthread_t t1, t2, t3, t4;
67     sem_init(&sem, 0, 0);
68     pthread_create(&t1, NULL, HandleData1, NULL);
69     pthread_create(&t2, NULL, HandleData2, NULL);
70     pthread_create(&t3, NULL, ReadData1, NULL);
71     pthread_create(&t4, NULL, ReadData2, NULL);
72     //usleep(1000);
73     //fflush(stdout);
74     /* 防止程序过早退出,让它在此无限期等待*/
75     pthread_join(t1, NULL);
76 }
printf有输出(\n)
 1 #include <stdio.h>
 2 #include <pthread.h>
 3 #include <semaphore.h>
 4 #include <unistd.h>
 5 #define MAXSTACK 100
 6 int stack[MAXSTACK][2];
 7 int size = 0;
 8 sem_t sem;
 9 /* 从文件1.dat读取数据,每读一次,信号量加一*/
10 void* ReadData1(void*)
11 {
12     FILE *fp = fopen("1.dat", "r");
13     if (fp == NULL) 
14     {
15         printf("open 1.dat failed!");
16         return NULL;
17     }
18     while (!feof(fp))
19     {
20         fscanf(fp, "%d%d", &stack[size][0], &stack[size][1]);
21         sem_post(&sem);
22         ++size;
23     }
24     fclose(fp);
25 }
26 /*从文件2.dat读取数据*/
27 void* ReadData2(void*)
28 {
29     FILE *fp = fopen("2.dat", "r");
30     if (fp == NULL) 
31     {
32         printf("open 2.dat failed!");
33         return NULL;
34     }
35     while (!feof(fp))
36     {
37         fscanf(fp, "%d%d", &stack[size][0], &stack[size][1]);
38         sem_post(&sem);
39         ++size;
40     }
41     fclose(fp);
42 }
43 /*阻塞等待缓冲区有数据,读取数据后,释放空间,继续等待*/
44 void *HandleData1(void *)
45 {
46     while (1)
47     {
48         //if (sem_trywait(&sem)<0) continue;
49         sem_wait(&sem);
50         printf("Plus:%d+%d=%d\n", stack[size][0], stack[size][1],stack[size][0] + stack[size][1]);
51         --size;
52     }
53 }
54 
55 void *HandleData2(void*)
56 {
57     while (1)
58     {
59         sem_wait(&sem);
60         printf("Multiply:%d*%d=%d\n", stack[size][0], stack[size][1],stack[size][0] * stack[size][1]);
61         --size;
62     }
63 }
64 int main(void)
65 {
66     pthread_t t1, t2, t3, t4;
67     sem_init(&sem, 0, 0);
68     pthread_create(&t1, NULL, HandleData1, NULL);
69     pthread_create(&t2, NULL, HandleData2, NULL);
70     pthread_create(&t3, NULL, ReadData1, NULL);
71     pthread_create(&t4, NULL, ReadData2, NULL);
72     //usleep(1000);
73     //fflush(stdout);
74     /* 防止程序过早退出,让它在此无限期等待*/
75     pthread_join(t1, NULL);
76 }
printf有输出(main正常结束)
 1 #include <stdio.h>
 2 #include <pthread.h>
 3 #include <semaphore.h>
 4 #include <unistd.h>
 5 #define MAXSTACK 100
 6 int stack[MAXSTACK][2];
 7 int size = 0;
 8 sem_t sem;
 9 /* 从文件1.dat读取数据,每读一次,信号量加一*/
10 void* ReadData1(void*)
11 {
12     FILE *fp = fopen("1.dat", "r");
13     if (fp == NULL) 
14     {
15         printf("open 1.dat failed!");
16         return NULL;
17     }
18     while (!feof(fp))
19     {
20         fscanf(fp, "%d%d", &stack[size][0], &stack[size][1]);
21         sem_post(&sem);
22         ++size;
23     }
24     fclose(fp);
25 }
26 /*从文件2.dat读取数据*/
27 void* ReadData2(void*)
28 {
29     FILE *fp = fopen("2.dat", "r");
30     if (fp == NULL) 
31     {
32         printf("open 2.dat failed!");
33         return NULL;
34     }
35     while (!feof(fp))
36     {
37         fscanf(fp, "%d%d", &stack[size][0], &stack[size][1]);
38         sem_post(&sem);
39         ++size;
40     }
41     fclose(fp);
42 }
43 /*阻塞等待缓冲区有数据,读取数据后,释放空间,继续等待*/
44 void *HandleData1(void *)
45 {
46     while (1)
47     {
48         //if (sem_trywait(&sem)<0) continue;
49         sem_wait(&sem);
50         printf("Plus:%d+%d=%dn", stack[size][0], stack[size][1],stack[size][0] + stack[size][1]);
51         --size;
52     }
53 }
54 
55 void *HandleData2(void*)
56 {
57     while (1)
58     {
59         sem_wait(&sem);
60         printf("Multiply:%d*%d=%dn", stack[size][0], stack[size][1],stack[size][0] * stack[size][1]);
61         --size;
62     }
63 }
64 int main(void)
65 {
66     pthread_t t1, t2, t3, t4;
67     sem_init(&sem, 0, 0);
68     pthread_create(&t1, NULL, HandleData1, NULL);
69     pthread_create(&t2, NULL, HandleData2, NULL);
70     pthread_create(&t3, NULL, ReadData1, NULL);
71     pthread_create(&t4, NULL, ReadData2, NULL);
72     usleep(1000);
73     fflush(stdout);
74     /* 防止程序过早退出,让它在此无限期等待*/
75     pthread_join(t1, NULL);
76 }
printf有输出(fflush)

 printf行缓冲区的分析总结

 

 main结束时调用exit(0)会刷新缓冲区

遇到\n,\r时会刷新缓冲区

fflush手动刷新

缓冲区满时自动刷新

 

C语言中exit()与return的区别

转载于:https://www.cnblogs.com/cdyboke/p/6815424.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值