Rust线程池代码调整后出现请求阻塞问题求解
问题原因分析
核心问题出在MutexGuard的作用域差异上:
原代码写法:
let job = rx.lock().unwrap().recv().unwrap(); job();这里
rx.lock().unwrap()返回的MutexGuard是临时值,仅在执行recv()的过程中存在。当recv()完成并把任务赋值给job后,这个临时的MutexGuard会立即被销毁,Mutex随之解锁。此时其他线程可以正常获取锁,处理新的请求。修改后的写法:
rx.lock().unwrap().recv().unwrap()();链式调用下,
MutexGuard的作用域覆盖了整个表达式的生命周期——从调用lock()开始,直到最后的任务执行完毕(也就是那5秒睡眠结束)。这意味着在任务执行的5秒内,Mutex一直处于锁定状态,其他线程无法获取锁来接收新的请求,自然就会阻塞到锁被释放为止。
简单总结:原写法是「拿锁→取任务→放锁→执行任务」,修改后变成「拿锁→取任务→执行任务→放锁」,执行任务的过程中锁没释放,导致其他线程抢不到锁处理新请求。
内容的提问来源于stack exchange,提问作者light
相关产品推荐
相关产品推荐

