1. 程式人生 > >c語言坑之printf緩沖區

c語言坑之printf緩沖區

tail multiply out ack splay 一次 fin eof lan

技術分享
 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行緩沖區的分析總結

c語言坑之printf緩沖區