2017-10-28 72 views
1

我試圖設置兩個線程之間的雙向通信:子線程既可以發送到父進程,也可以從父進程接收,父進程可以發送去和從孩子接收。由於這樣的事實,在鏽通道是單向的,我使用的是一組雙通道的,像這樣的組織(從我家釀線程庫代碼段):收件人關閉並返回一個SendError嘗試通過通道發送

let (tx, rx) = channel(); 
let (tx2, rx2) = channel(); 

(Endpoint { 
    sender: tx2, 
    receiver: rx, 
}, 
Endpoint { 
    sender: tx, 
    receiver: rx2, 
}) 

我在我的設置功能的代碼如下所示:

let BiChannel { 
    e1: world, 
    e2: thread, 
} = BiChannel::new(); 

let ws = WorldState { 
    ... 
    thread_endpoint: thread, 
}; 
std::thread::spawn(threading::handle_life(world)); 

在這個片段中,threading::handle_life函數將返回使用端點通過此舉閉合(world在上面的代碼)傳達給父線程,而父線程使用ws.thread_endpoint交談的子線程。

我打電話給所有打到端點上send的電話打包,所以如果它發送失敗,它會崩潰。果然,我得到一個運行時錯誤,看起來像這樣:

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: "SendError(..)"', src/libcore/result.rs:860 
note: Run with `RUST_BACKTRACE=1` for a backtrace. 

的文檔上,這是非常微薄的,但我能圖什麼小了是,如果通道被關閉,這只是發生。

回答

1

事實證明,問題在於我忘記將消息接收代碼放入子線程中,因此一旦它收到第一條消息,就會退出並關閉對應的通道。

相關問題