Процесс никогда не завершается после успешного получения канала mps c в Rust? - PullRequest
0 голосов
/ 22 апреля 2020

Вот код:

use std::thread;
use std::sync::mpsc;

fn main() {

    //spawn threads 
    let (tx, rx) = mpsc::channel();
    for mut i in 0 .. 10 {
        let txc = tx.clone();   //clone from the main sender
        thread::spawn( move || {            
            i += 20;
            println!("Sending: {}", i);
            txc.send(i).unwrap_or_else(|e| {
                eprintln!("{}", e);
            });
        });
    }

    for received in rx {
        println!("Received: {}", received);
    }

}

Код выполняется успешно, однако он зависает, и процесс никогда не завершается в конце! Я подумал, что это может быть связано с закрытием концов канала, и я попытался сбросить tx.drop() и rx.drop(), из-за чего компилятор не допустил меня к этому.

Что я здесь не так делаю?

1 Ответ

2 голосов
/ 22 апреля 2020

tx в вашем основном потоке не удаляется до конца функции main, а rx не будет закрываться, пока не будут удалены все отправители.

Чтобы это исправить, вы можете вручную сбросьте его с <a href="https://doc.rust-lang.org/std/mem/fn.drop.html" rel="nofollow noreferrer">drop</a>(tx) после того, как вы запустили все свои потоки:

use std::thread;
use std::sync::mpsc;

fn main() {

    //spawn threads 
    let (tx, rx) = mpsc::channel();
    for mut i in 0 .. 10 {
        let txc = tx.clone();   //clone from the main sender
        thread::spawn( move || {            
            i += 20;
            println!("Sending: {}", i);
            txc.send(i).unwrap_or_else(|e| {
                eprintln!("{}", e);
            });
        });
    }

    // drop tx manually, to ensure that only senders in spawned threads are still in use
    drop(tx);

    for received in rx {
        println!("Received: {}", received);
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...