我有一個程式,它使用多個執行緒來暴力破解一些加密字串。主執行緒有一個通道,發送者被克隆并發送到每個執行緒。當一個執行緒找到答案時,它將它發送給主執行緒中的接收者。
在這個程式中,我沒有加入執行緒,而是使用阻塞呼叫sender.recv()來掛起主執行緒,直到另一個執行緒完成。
我的希望是,一旦這個呼叫完成,主執行緒將回傳并且所有其他作業執行緒將被終止。
這是一個糟糕的設計選擇嗎?是否存在其他執行緒中沒有某些條件會導致它們在發現解決方案時回傳的缺點?在技??術上完成之前依靠編譯器清理我的執行緒是否可以/安全?
uj5u.com熱心網友回復:
假設沒有清理作業要做,你所做的大部分是無害的。我假設您的作業執行緒現在看起來像這樣。
fn my_thread() {
// ... lots of hard work ...
channel.send(my_result);
}
如果是這樣的話,那么“我收到結果”和“另一個執行緒被終止”是非常相似的事件,“這個函式回傳”的區別可能無關緊要。但是假設有人出現并將代碼更改為如下所示。
fn my_thread() {
// ... lots of hard work ...
channel.send(my_result);
do_cleanup_stuff();
}
如果您的主執行緒之前終止,現在do_cleanup_stuff()可能沒有機會運行my_thread。如果該清理功能很重要,那可能會導致問題。它可能比這更微妙。如果 in 中的任何區域變數my_thread包含檔案句柄或打開的 TCP 流或任何其他具有非平凡實作的物件,則如果您不使用執行緒Drop,則該值可能無法正確獲取。Dropjoin
因此,這可能是join所有事情的最佳實踐,即使這只是main.
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/424574.html
