c - 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)
. 如果我离开它,程序将启动,保持活动状态,但它什么也不打印。任何想法为什么会发生这种情况?
解决方案
printf
是行缓冲的,这意味着它不会将缓冲区刷新到屏幕,直到它到达换行符"\n"
或缓冲区已满。当你不睡觉时,缓冲区会很快填满并在它满时打印到屏幕上,但是当你睡觉时,缓冲区需要很长时间才能填满,所以你在屏幕上看不到任何东西。尝试将其更改为printf("aaa\n");
,或fflush(stdout);
在printf
. 在此处查看更多信息:为什么 printf 在调用后不刷新,除非换行符在格式字符串中?
推荐阅读
- php - Google Cloud Larvavel 项目部署错误
- php - 在 Elastic Beanstalk 上创建 cronjob 时遇到问题
- docker - docker-registry 如何在 openshift 源中保存图像
- api - 我如何在 laravel 6 中缓存对象及其关系
- python - 如何在我的烧瓶服务器中使用 tkinter 或 Kivy 弹出窗口?
- .net - 如何在 C# 中获取目标系统的 .NET CORE 版本号
- magento - Magento 1.9 - Zend/Currency - 格式错误...缺少 0
- python-3.x - 将长格式日期转换为短格式
- redis - 如何获取设置的redis db?
- c# - 如何在 Visual Studio 中使用 localDB(MDF) 在数据库中重新设置标识列