qinguoyi / TinyWebServer

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

我感觉代码有点问题。 #230

Open nullptroot opened 1 year ago

nullptroot commented 1 year ago

为什么哪个reactor模式里面,把任务加入到线程池的队列后,下面有一个死循环来等待任务完成啊,这不就阻塞了吗,不会影响并发吗

1685780687527

nullptroot commented 1 year ago

在webserver.cpp的dealwithwrit 和 dealwithread里面

q664171689 commented 12 months ago

确实会阻塞一段时间,这个循环好像是用来保证数据被顺利读入和写入的,如果没有顺利读入和写入就会被释放。

nullptroot commented 12 months ago

reactor模式不就是把数据读写交给子线程吗,那如果这样的话,不就相当于主线程来读数据了吗,而且还不是异步io,这多影响并发啊 我也不是特别了解,我小白 就是感觉会影响并发

q664171689 commented 12 months ago

读写确实交给了线程池,但是主程序确实也在跟着罚站,可以试试把while去掉,我看作者的详解里面的run函数和现在的也不太一样,可能这个循环也是后来加上去的。

bizarre-hhh commented 11 months ago

感觉这里是写的不好,主线程阻塞在等子线程读写成功,应该让子线程返回这个读写结果,读写失败则主线程处理

ultrakl commented 3 months ago

可以建一个全局队列来保存子线程的返回结果,在链表中的tick函数删定时器时可以检查队列中的读写返回结果,但我也没实现,只是个构想

arglone commented 2 months ago

这里不如改成主线程处理IO,这样就是一个典型的单Reactor多线程模型了。另外顺带一提,感觉项目的Proactor模式设计的也很奇怪,Proactor的核心是用户程序不负责阻塞IO,这里看来作者只是让线程池工作线程不负责IO了,主线程照样阻塞IO。再结合作者把Reactor模式写成工作线程处理阻塞IO,搞得好像Reactor模式和Proactor模式的区别是主线程还是工作线程处理阻塞IO一样,实际上我觉得不是这样。 当然这个项目其它大部分地方设计得都很好的。