2016-10-05 45 views
1

我寫一個多線程的Web服務器,基本上我需要跨多個線程的用戶提供的處理程序對象的Vec<Handler>複製服務器上啓動。我嘗試幾種方法:如何在線程之間共享處理程序?

1)定義處理程序爲具有fn process(&mut self, Request) -> Response方法的性狀。用戶將爲每個處理程序結構實現它。這種方法在C++或python等語言中很常見。問題是生鏽不允許我複製或克隆特質對象,因爲它暗示了禁止在特質對象上綁定的特徵對象Sized

2)定義處理程序作爲Box<FnMut(Request) -> Response>。這不起作用,因爲關閉不可複製。

3)我可以線程之間共享同一個對象,但這種讓人很沒有意義我,因爲我需要一個互斥體,其將引入的時候我其實只需要在線程單獨副本無用的爭論。

我怎樣才能正確地實現這一點?

回答

1

最簡單的解決方案是要求用戶定義的克隆方法。

trait Handler { 
    fn process(&mut self, r: Request) -> Response; 
    fn duplicate(&self) -> Box<Handler>; 
} 

然後你可以很容易地複製你的Vec<Box<Handler>>

+0

感謝您的建議。不幸的是,它似乎不適用於線程。給定的線程擁有Box ,但不包含Handler,這意味着Handler需要實現Send。 Rust無法弄清楚Handler對象在線程之外沒有引用。這迫使我使Handler線程安全。 – ElefEnt

+0

複製和線程安全是不同的問題,事實上,如果你希望通過線程發送處理程序,你需要添加綁定到Handler的'Send'(也可能是靜態綁定),或者你可以添加它們到Box中,如Box '。爲了方便,我會推薦前者。 –

+0

命名該方法'克隆'可能會造成混淆。 – mcarton

相關問題