markparticle / WebServer

C++ Linux WebServer服务器
Apache License 2.0
3.58k stars 733 forks source link

log按行数拆分文件存在问题 #54

Open smallmocha opened 2 years ago

smallmocha commented 2 years ago

log文件,比如设置达到50行则拆分文件,实际结果,大多数情况下都不是50行一个log文件,有40多行的,也有50多行的。试过把锁的范围扩大,并没有解决这个问题。

puppet12306 commented 2 years ago

1.阻塞队列flush函数有问题,他只是唤醒了一个消费者,但没有确保队列被清空,我尝试加了个while强制清空,可以解决,但是多线程下速度变得非常慢 2.锁的范围也确实不对,应该在判断是否需要拆分之前就加锁,不然进去if以后线程切换了还是不对

smallmocha commented 2 years ago
smallmocha commented 2 years ago

1.阻塞队列flush函数有问题,他只是唤醒了一个消费者,但没有确保队列被清空,我尝试加了个while强制清空,可以解决,但是多线程下速度变得非常慢 2.锁的范围也确实不对,应该在判断是否需要拆分之前就加锁,不然进去if以后线程切换了还是不对

后面确实想到了是这个问题,在创建打开新文件之前,并不能保证阻塞队列里面的日志都被消费完。while循环是怎么解决的。生产日志的线程和消费日志的线程不同,唤醒消费者(写日志的线程),不能保证消费者线程马上得到cpu调度吧

puppet12306 commented 2 years ago

1.阻塞队列flush函数有问题,他只是唤醒了一个消费者,但没有确保队列被清空,我尝试加了个while强制清空,可以解决,但是多线程下速度变得非常慢 2.锁的范围也确实不对,应该在判断是否需要拆分之前就加锁,不然进去if以后线程切换了还是不对

后面确实想到了是这个问题,在创建打开新文件之前,并不能保证阻塞队列里面的日志都被消费完。while循环是怎么解决的。生产日志的线程和消费日志的线程不同,唤醒消费者(写日志的线程),不能保证消费者线程马上得到cpu调度吧

我只是在队列的flush中加了个循环判断queue的size是否为空,不为空就一直唤醒消费者,验证了一下确实是这里出了问题; 实际的完美的解决方法我暂时还没想到

HUSTfishball commented 2 years ago

想问一下为什么需要两个条件变量呢, 我感觉一个条件变量也可以诶