【发布时间】:2016-06-14 17:10:15
【问题描述】:
我正在尝试使用协程作为学习练习(不是家庭作业)在 Rust 中实现 Eratosthenes 的筛子,但我找不到任何合理的方法将每个线程连接到 Receiver 和 Sender 的末端两个不同的渠道。
Receiver 涉及两个不同的任务,即报告迄今为止发现的最高素数,并为过滤器提供更多候选素数。这是算法的基础。
这是我想做但不能做的,因为 Receiver 不能在线程之间传输。毫不奇怪,使用 std::sync::Arc 似乎没有帮助。
请注意,我明白为什么这不起作用
fn main() {
let (basetx, baserx): (Sender<u32>, Receiver<u32>) = channel();
let max_number = 103;
thread::spawn(move|| {
generate_natural_numbers(&basetx, max_number);
});
let oldrx = &baserx;
loop {
// we need the prime in this thread
let prime = match oldrx.recv() {
Ok(num) => num,
Err(_) => { break; 0 }
};
println!("{}",prime);
// create (newtx, newrx) in a deliberately unspecified way
// now we need to pass the receiver off to the sieve thread
thread::spawn(move || {
sieve(oldrx, newtx, prime); // forwards numbers if not divisible by prime
});
oldrx = newrx;
}
}
等效的工作 Go 代码:
func main() {
channel := make(chan int)
var ok bool = true;
var prime int = 0;
go generate(channel, 103)
for true {
prime, ok = <- channel
if !ok {
break;
}
new_channel := make(chan int)
go sieve(channel, new, prime)
channel = new_channel
fmt.Println(prime)
}
}
在Receiver 需要移交给不同线程的这种情况下,最好的方法是什么?
【问题讨论】: