1
我試圖使用協程作爲學習練習(而不是作業)來實現Rust中的Eratosthenes篩,我找不到任何合理的方式將每個線程連接到兩個不同通道的末端Receiver
和Sender
。如何在Rust中使用通道菊花鏈線程?
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
需要切換到不同的線程?