Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

blockDeque的一些疑问 #118

Open
Yuan-GG opened this issue Nov 29, 2024 · 2 comments
Open

blockDeque的一些疑问 #118

Yuan-GG opened this issue Nov 29, 2024 · 2 comments

Comments

@Yuan-GG
Copy link

Yuan-GG commented Nov 29, 2024

1.双端队列哪里有体现吗,异步写log不应该得按照日志数据的顺序来的吗?
2.为什么pop跟push函数中,pop的while要判断队列是否关闭从而返回false,但是push中却没有这个判断呢。我的理解是既然是异步了,就得做好丢失数据的可能(小白不知道有没有什么其他办法可以解决),那push也应该判断是否关闭了,不然是不是我日志系统关闭后还能继续push但是不能pop了,那不是没意义了(写入缓冲区但是没有写到文件中)
image
image

@colder20040320
Copy link

1..这个项目没有使用双端队列,但给出了诸如pop_back pop_front等函数
2.. 异步是指你不知道程序在什么时候写入到日志文件中,并不是在你调用LOG_ERROR等宏时立刻写入,是先放到异步队列中,每次从队列的头部拿取数据,因此依旧是按顺序写入文件的,但你并不知道具体是哪个时刻
3..在Log类的析构函数中,先使用while(!deque_->empty())将日志逐条写入文件,每次调用deque_flush()都会唤醒condConsumer,也就是说在这个while循环中就会把全部的数据从队列写入到文件中。 不用担心数据可能丢失,因为调用Log的前提是什么?只能是主程序正常结束或者提前结束(Log是static对象,在整个程序结束时才销毁),也就是说当你进入了Log函数中,也就意味着主程序已经结束了,那根本不能再有push_back函数了,而在while循环中你也已经将已经在队列中的数据全部写入到文件中。 接着调用Close函数,这个函数的作用就是唤醒处理异步队列的线程,并且将isClose_设置为true,很显然,线程结束,接着再调用writeThread->join()将线程回收即可

@Yuan-GG
Copy link
Author

Yuan-GG commented Dec 5, 2024

1..这个项目没有使用双端队列,但给出了诸如pop_back pop_front等函数 2.. 异步是指你不知道程序在什么时候写入到日志文件中,并不是在你调用LOG_ERROR等宏时立刻写入,是先放到异步队列中,每次从队列的头部拿取数据,因此依旧是按顺序写入文件的,但你并不知道具体是哪个时刻 3..在Log类的析构函数中,先使用while(!deque_->empty())将日志逐条写入文件,每次调用deque_flush()都会唤醒condConsumer,也就是说在这个while循环中就会把全部的数据从队列写入到文件中。 不用担心数据可能丢失,因为调用Log的前提是什么?只能是主程序正常结束或者提前结束(Log是static对象,在整个程序结束时才销毁),也就是说当你进入了Log函数中,也就意味着主程序已经结束了,那根本不能再有push_back函数了,而在while循环中你也已经将已经在队列中的数据全部写入到文件中。 接着调用Close函数,这个函数的作用就是唤醒处理异步队列的线程,并且将isClose_设置为true,很显然,线程结束,接着再调用writeThread->join()将线程回收即可

关于log还有一个点没明白,写线程FlushLogThread中锁的逻辑应该是这样的?while判断条件中进入pop,pop会先获取锁,如果队列为空则释放锁进入休眠,然后while条件满足了,就获取锁保护fp,进行fputs操作,写完之后又释放。那就有个问题,如果write中需要切换文件,然后又在图三中第一句等待锁的释放,那写线程(图二)尚未写完当前log队列的数据,那锁被write获取了,进行切换为文件的操作,这会不会导致旧数据写入新文件。还是说我对锁的理解错了

image
image
下面这个节选write中切换文件的一段代码
image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants