2016-03-01 7 views
5

मैं कुछ कोड scoped_threadpool का उपयोग करता है इस तरह एक सा है:मैं scoped_threadpool थ्रेड से एक त्रुटि कैसे वापस कर सकता हूं?

extern crate scoped_threadpool; 

use scoped_threadpool::Pool; 
use std::error::Error; 

fn main() { 
    inner_main().unwrap(); 
} 

fn inner_main() -> Result<(), Box<Error>> { 
    let mut pool = Pool::new(2); 

    pool.scoped(|scope| { 
     scope.execute(move || { 
      // This changed to become fallible 
      fallible_code(); 
     }); 
    }); 

    Ok(()) 
} 

fn fallible_code() -> Result<(), Box<Error + Send + Sync>> { 
    Err(From::from("Failing")) 
} 

fallible_code समारोह हाल ही में एक Result वापस जाने के लिए बदल गया है, और मैं pool.scoped ब्लॉक के बाहर त्रुटि का प्रचार करना चाहते हैं। हालांकि, Scope::execute के हस्ताक्षर की वापसी मूल्य के लिए अनुमति नहीं देता:

fn execute<F>(&self, f: F) 
    where F: FnOnce() + Send + 'scope 

मैं scoped_threadpool 0.1.7 का उपयोग कर रहा हूँ।

उत्तर

2

मुझे नहीं पता कि यह एक विशेष रूप से बेवकूफ विधि है, लेकिन एक तरीका है कि कम से कम काम एक कब्जे वाले चर को असाइन कर रहा है।

let mut pool = Pool::new(2); 
let mut ret = Ok(()); 

pool.scoped(|scope| { 
    scope.execute(|| { 
     ret = fallible_code(); 
    }); 
}); 

ret.map_err(|x| x as Box<Error>) 

जाहिर है आप अगर कोई तुच्छ डिफ़ॉल्ट है ret एक Option या तो बनाने की जरूरत होगी। यदि आंतरिक बंद होना move होना चाहिए, तो आपको ret_ref = &mut ret स्पष्ट करना होगा।

+0

विचार अच्छा लगता है, लेकिन 'सिंक'' नहीं होना चाहिए? –

+0

@MatthieuM। यह है, यही कारण है कि 'ret.map_err (| x | x बॉक्स के रूप में)' 'inner_main' के रिटर्न प्रकार से मेल खाने के लिए आवश्यक है। – Veedrac

संबंधित मुद्दे

 संबंधित मुद्दे