Rust Dining Philosopher代码疑问:主线程遍历rx时子线程未启动会退出?
Rust Dining Philosophers示例:主线程会因子线程未启动直接退出吗?
我是Rust新手,正在学习Dining Philosopher的实现代码。当主线程执行到如下代码时,是否可能所有已生成的线程都尚未开始执行逻辑,导致rx中无数据,程序直接退出?
for thought in rx { println!("{}", thought); }
不会出现这种情况,核心原因和Rust标准库的mpsc通道机制直接相关:
- 这段
for循环是在遍历mpsc通道的接收端rx。rx的迭代器会持续阻塞等待新数据,只有当所有对应的发送端(tx)实例都被销毁后,迭代器才会结束,循环才会退出。 - 在该示例中,每个哲学家线程都持有一个
tx的克隆对象。只要这些线程还在运行,tx就会一直存在,rx就会认为通道仍处于活跃状态。哪怕主线程先进入循环、子线程还没开始发送数据,主线程也会卡在循环的第一个等待节点,直到子线程发送数据过来,绝不会直接退出。 - 只有当所有哲学家线程执行完毕,它们持有的
tx被自动销毁,且主线程侧的tx也被销毁后,rx的迭代才会终止,程序才会结束运行。
内容的提问来源于stack exchange,提问作者Ashika Umanga Umagiliya
相关产品推荐
相关产品推荐

