SyncSender的Rust并发问题

1l5u6lss  于 2023-02-08  发布在  其他
关注(0)|答案(2)|浏览(144)

我是新来的 rust ,并试图了解餐饮哲学家代码在这里:
https://google.github.io/comprehensive-rust/exercises/day-4/solutions-morning.html
当执行到达主线程中的以下行时,是否有可能没有一个派生的线程开始执行它们的逻辑,导致'rx'中没有任何内容,程序只是退出?

for thought in rx {
        println!("{}", thought);
}
huus2vyu

huus2vyu1#

当在通道上迭代时,它在内部调用Receiver::recv,其中文档指定
如果没有可用的数据并且有可能发送更多数据(至少一个发送者仍然存在),此函数将始终阻塞当前线程。一旦消息发送到相应的发送者(或SyncSender),此接收者将唤醒并返回该消息。
因此,接收方将阻塞,直到它有数据可用,或所有的发送方已被丢弃。

bprjcwpo

bprjcwpo2#

是的,执行可以在线程开始之前到达for thought in rx { ... },但是,这仍然有效,因为在Receiver上的迭代将等待直到有消息为止,并且只有在所有Sender都被销毁时才会停止(因此不再可能接收任何消息)。

相关问题