TinyWebServer icon indicating copy to clipboard operation
TinyWebServer copied to clipboard

新人小白,对threadpool运行逻辑的一些疑问

Open tomatowithpotato opened this issue 2 years ago • 4 comments

一、取任务 线程取任务会用while循环去检查信号量m_queuestat,为什么拿到信号量之后还要再判断队列是否为空呢?能拿到m_queuestat不就意味着队列肯定有任务吗? 二、放任务 append函数检查到队列超过上限后会直接退出,这样的话如果不会导致一些请求丢失吗? 我猜测这样做的原因是因为放任务是由主线程完成的,如果等待队列有位置再放入会阻塞主线程,从而影响程序运行?

tomatowithpotato avatar May 08 '22 03:05 tomatowithpotato

关于第一个问题,我个人的理解他这里应该是一种更加通用的写法,通用场景下,当拿到信号量后,并不能确保队列中一定是存在任务的,因为有可能是别的线程只调用了broadcast,但是并没有为队列插入实际的任务。每次拿到信号量之后再判断一次队列是否为空,就可以避免出错了。

HandsomeJims avatar Jul 01 '22 09:07 HandsomeJims

关于第一个问题,我个人的理解他这里应该是一种更加通用的写法,通用场景下,当拿到信号量后,并不能确保队列中一定是存在任务的,因为有可能是别的线程只调用了broadcast,但是并没有为队列插入实际的任务。每次拿到信号量之后再判断一次队列是否为空,就可以避免出错了。

我后来思考了一下,可能是因为brocast之后,可能先被唤醒的线程已经把队列取空,结果当前线程被唤醒的时候已经是个空队列了,所以要加判断来避免这种情况。

tomatowithpotato avatar Jul 05 '22 01:07 tomatowithpotato

关于第一个问题,我个人的理解他这里应该是一种更加通用的写法,通用场景下,当拿到信号量后,并不能确保队列中一定是存在任务的,因为有可能是别的线程只调用了broadcast,但是并没有为队列插入实际的任务。每次拿到信号量之后再判断一次队列是否为空,就可以避免出错了。

我后来思考了一下,可能是因为brocast之后,可能先被唤醒的线程已经把队列取空,结果当前线程被唤醒的时候已经是个空队列了,所以要加判断来避免这种情况。

@tomatowithpotato 我还有点疑问,就是broadcast之后,如果是由于多个线程同时唤醒导致了竞争,进而导致某些线程可能拿不到队列中的任务,那直接将broadcast换成notify,每次只唤醒一个线程,是不是就可以了?

HandsomeJims avatar Jul 05 '22 02:07 HandsomeJims

第二个问题我感觉解释的有道理

loook98 avatar Jul 12 '22 08:07 loook98