(Rust Compiler Version 1.64.0) 我想做的是:我想為一些 minecraftesque 世界創建某種世界生成程序。因此,我希望能夠將一個函式傳遞給一些世界生成器,并在每個塊上執行這個函式。到目前為止,這個程序是單執行緒的,我想至少在塊生成程序中多執行緒,因為這不需要同步,這是一個非常多處理器友好的事情。
現在,我目前有(類似的)一個功能
generate_world(self: &mut Self, generator : impl Fn(isize, isize, isize) ->BlockType) ->(){}
這個函式中間有一個大的 for 回圈,每次需要時都會單執行緒呼叫函式生成器。
我現在決定做的是使用執行緒池板條箱。這使我可以創建一個pool: ThreadPool, 并呼叫pool.execute(move ||{});來執行一項作業(例如,首先進行一些準備,然后生成一個塊,或者更確切地說是一次整個連勝)。
我還遇到的是,該生成器在第一次呼叫時被移到執行緒函式中,但這已經(顯然)通過裝箱和弧形來修復。
現在,我當然嘗試將生成器函式放在那里,并且正確地警告我應該在生成器函式上指定 Send 和 Sync,我毫不費力地做到了。現在的問題是我還應該指定一個生命周期,建議的是:'static. 不幸的是,我的程式結構不允許我這樣做,因為函式中的某些組件的生命周期確實受到主函式的一部分的限制。
我能做些什么來完成這項作業?我知道在整個生成程序完成之前,該功能不會超出范圍。
我對 rust 很陌生,所以我可能(并且可能)忘記了許多隱藏在檔案深處的概念。我很確定,有一種非常干凈且非常像生銹的方法來解決這個問題,但我的思想停留在 C 思維中。:)
uj5u.com熱心網友回復:
不幸的是,我的程式結構不允許我這樣做,因為函式中的某些組件的生命周期確實受到主函式的一部分的限制。
這是您需要更改的部分。更改程式的這些部分,以便從main().
對常量資料使用
consts 或static變數。使用
Arc而不是&參考在啟動時計算的共享資料。或者,如果絕對必要(例如當資料不是恒定的并且必須在
Copy需求中參考時)并且您只打算在啟動時執行一次,使用Box::leak(Box::new(data))來獲取&'static對某些以后永遠不會被釋放的資料的參考。除了只計算一次的資料之外,你不能將它用于任何東西,因為這樣你的程式就會真正意義上的記憶體泄漏,并且會不斷增長。
可以使用作用域執行緒將借來的資料傳遞給執行緒,但這種方法需要對執行緒進行特殊控制,并且不適用于 GUI 事件回圈或執行緒池等本身沒有明確作用域的事物。
進一步說明:
為什么我需要傳遞具有靜態生命周期的東西?執行緒不會活那么久,所有東西都直接連接在下面。
很簡單:借用檢查器不理解執行緒連接。它只查看非常特殊的編譯時資訊,并且“當join()呼叫此函式時,執行緒必須隨后退出”不是它可以執行的推理。廣義上講,借用檢查器只關心未發生的事情(“此參考不在此生命周期之外使用”)并且不能使用確實發生的事情,例如“join() 被呼叫”,作為程式合理的證據.
我上面提到的“作用域執行緒”是一種使借用檢查器可以理解停止執行緒的方法——通過使之看起來像是退出函式作用域,借用檢查器確實將其理解為借用肯定結束的原因。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/523272.html
標籤:多线程锈线程安全线程池
上一篇:std::condition_variable不適用于std::this_thread::sleep_for()
