看ThinyWebSocket的时候有个疑问
#define LOG_DEBUG(format, ...) if(0 == m_close_log) {Log::get_instance()->write_log(0, format, ##__VA_ARGS__); Log::get_instance()->flush();}
为什么write之后还需要flush,这个flush有什么意义
void Log::flush(void)
{
m_mutex.lock();
//强制刷新写入流缓冲区
fflush(m_fp);
m_mutex.unlock();
}
看注释强制书信写入流缓冲区,嗯,作用知道了,为啥需要这玩意儿呢?查了下资料,看到个例子大致清楚了
#include<stdio.h>
int main()
{
printf("hello");
sleep(5);
printf(" world!\n");
return 0;
}
//先进入sleep,再打印hello 后打印world!
#include<stdio.h>
int main(){
printf("hello");
fflush(stdout);//将缓冲区的内容输出到设备中
sleep(5);
printf(" world!\n");
return 0;
}
//先打印hello 在进入sleep 后打印world!
大家可以编译运行下两个例子,屏幕输出结果似乎一样都输出hello world!这个fflush没什么意义,只是一个是先输出hello再往下执行,一个是先执行了下面的sleep,然后才屏幕输出信息的。这就辅助理解了printf甚至fputs等等函数,其实他们只是把字符串压入缓冲区了就返回了,至于缓冲区对应的去显示或者写文件等耗时操作都是其他地方执行的,并非同步执行完才往下执行,所以这个时候的fflush就有了意义,可以确保执行现有缓冲区操作完毕继续往下执行。这在多线程编程里是很有意义的。比如你的写日志线程被关闭了,但是缓冲操作还没执行完毕,这时就会出现日志记录不全甚至进程崩溃等严重问题。