首页 > 解决方案 > C - 线程中的 sleep() 会出现问题

问题描述

sleep() 函数在程序中给我带来了问题。我只声明了一个互斥锁、一个条件变量和一个全局变量:

pthread_mutex_t mutex;
pthread_cond_t something1;
int protected = 1;

在初始化它们并在 main 中创建 2 个线程之后pthread_create,我写了这个:

void *Thread(void *arg)
{
        while(1){
                pthread_mutex_lock(&mutex);

                while(protected == 0){
                        pthread_cond_wait(&something1, &mutex);
                }
                printf("aaa");

                sleep(2);

                pthread_mutex_unlock(&mutex);
        }
        pthread_exit(NULL);

}

void *Thread2(void *arg){
        while(1){
                pthread_mutex_lock(&mutex);

                while(protected == 1){
                        pthread_cond_wait(&something1, &mutex);
                }

                pthread_mutex_unlock(&mutex);
        }
        pthread_exit(NULL);

}

这应该永远在循环中打印“aaa”,如果我删除sleep(2). 如果我离开它,程序将启动,保持活动状态,但它什么也不打印。任何想法为什么会发生这种情况?

标签: cpthreads

解决方案


printf是行缓冲的,这意味着它不会将缓冲区刷新到屏幕,直到它到达换行符"\n"或缓冲区已满。当你不睡觉时,缓冲区会很快填满并在它满时打印到屏幕上,但是当你睡觉时,缓冲区需要很长时间才能填满,所以你在屏幕上看不到任何东西。尝试将其更改为printf("aaa\n");,或fflush(stdout);printf. 在此处查看更多信息:为什么 printf 在调用后不刷新,除非换行符在格式字符串中?


推荐阅读