首先看以下的函数
<span style="font-size:18px;">void writelog(char* file, char* msg) { FILE*fp=NULL; int nDataLen = strlen(msg); fp=fopen(file,"ab+");//仅仅供读取 if(fp!=NULL) { fwrite(msg, nDataLen, 1, fp); } fclose(fp);//关闭文件 }</span>
这个有什么问题呢?当fp为空的时候。是不是也会运行fclose(fp)?
改动例如以下:
<span style="font-size:18px;">void writelog(char* file, char* msg) { FILE*fp=NULL; int nDataLen = strlen(msg); fp=fopen(file,"ab+");//仅仅供读取 if(fp!=NULL) { fwrite(msg, nDataLen, 1, fp); fclose(fp);//关闭文件 } }</span>
这样是不是就没问题了呢?
当多线程中调用这个日志函数的时候,会不会有问题?
所以有一种方法就是加锁,但这样效率可能会低一些。
第二种方法就是用一个线程来接收其它线程的写日志的消息。有一个线程来专门写日志。
这样工作线程不会堵塞,可提高并发效率。
编程和设计的过程,就是一个逐步完好的过程,没有人一開始会想的非常全面,也没有绝对的错误的代码和设计。
假设有明显的功能错误。在设计过程中。就会改正。就比方最開始的那个函数,fp为空的概率有多少?所以一般不会出错。当日志函数仅仅在单线程中使用。那考虑加锁和多线程消息也是多余。所以。要看应用场景。
程序猿都非常反感需求的变化。需求,就是应用场景。
仅仅有在需求确认了,才干够设计出相对匹配的方案出来。不一定是完美的,但肯定是在综合各种因素的情况下,是最优的。
周期是要考虑的,成本是要考虑的。
转载请注明原创链接:http://blog.csdn.net/wujunokay/article/details/38310669