Process never exits after successfully receiving from MPSC channel

僤鯓⒐⒋嵵緔 提交于 2021-02-17 06:23:06

问题


Here's the code:

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);
    }

}

The code runs successfully but it hangs and the process never exits at the end.

I thought it could be related to closing the channel ends and I tried dropping by tx.drop() and rx.drop() but the compiler gave an error.

What am I doing wrong here?


回答1:


tx in your main thread is not dropped until the end of the main function, and rx will not be closed until all senders have been dropped.

To fix this, you can manually drop it with drop(tx) after you have started all of your threads:

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);
    }

}


来源:https://stackoverflow.com/questions/61364917/process-never-exits-after-successfully-receiving-from-mpsc-channel

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!