zoukankan      html  css  js  c++  java
  • 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
    ", 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
    ", 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有输出( )
     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
    ", 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
    ", 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)会刷新缓冲区

    遇到 , 时会刷新缓冲区

    fflush手动刷新

    缓冲区满时自动刷新

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

  • 相关阅读:
    ES6新语法之---块作用域let/const(2)
    sass变量
    Ruby(或cmd中)输入命令行编译sass
    sass的安装
    鼠标滚动兼容
    HTML5新标签兼容——> <!--<if lt IE 9><!endif-->
    #include stdio.h(7)
    #include stdio.h(6)
    #include stdio.h(5)
    #include stdio.h(3)
  • 原文地址:https://www.cnblogs.com/cdyboke/p/6815424.html
Copyright © 2011-2022 走看看