qinguoyi / TinyWebServer

:fire: Linux下C++轻量级WebServer服务器
Apache License 2.0
16.93k stars 3.97k forks source link

代码错误 #296

Open JohnZhouCoder opened 1 month ago

JohnZhouCoder commented 1 month ago

1.block_queue.h中pop函数调用的timewait不在while循环中,可能会出现线程虚假唤醒的现象,应该在while(m_size<=0)循环中调用timewait函数 2.pop函数中的时间处理也有问题 屏幕截图 2024-10-18 171136 修改后的代码如下 屏幕截图 2024-10-18 173207

gggggwen commented 1 month ago

我也赞同时间处理有问题, 但是我认为 bool pop(T &item, int ms_timeout) 是没有问题的 , 因为这份代码进行了双检测, 在 线程被唤醒后, 会再一次确认队列中是否有数据进行处理

gggggwen commented 1 month ago

我也赞同时间处理有问题, 但是我认为 bool pop(T &item, int ms_timeout) 是没有问题的 , 因为这份代码进行了双检测, 在 线程被唤醒后, 会再一次确认队列中是否有数据进行处理

此外, 如果说被唤醒后队列事实上已经不存在数据需要处理了 就直接返回false

JohnZhouCoder commented 1 month ago

我也赞同时间处理有问题, 但是我认为 bool pop(T &item, int ms_timeout) 是没有问题的 , 因为这份代码进行了双检测, 在 线程被唤醒后, 会再一次确认队列中是否有数据进行处理

此外, 如果说被唤醒后队列事实上已经不存在数据需要处理了 就直接返回false

你说的对,我没有考虑到

JohnZhouCoder commented 1 month ago

我也赞同时间处理有问题, 但是我认为 bool pop(T &item, int ms_timeout) 是没有问题的 , 因为这份代码进行了双检测, 在 线程被唤醒后, 会再一次确认队列中是否有数据进行处理

此外, 如果说被唤醒后队列事实上已经不存在数据需要处理了 就直接返回false

我这样改了之后,会阻塞等待,那么就没有写超时等待的必要了