2015-07-11 9 views
8

Ich habe so etwas.Wie Arc in Mehrfachverschluß freigeben

let arc = Arc::new(); 
|| { 
    arc.clone() 
} 
||{ 
    arc.clone() 
} 

Ich erhalte

capture of moved value: arc 

Ich verstehe, warum ich dies immer. Der Klon wird nicht aufgerufen, bevor der Bogen an den Abschluss übergeben wird. Ich kann das beheben, indem ich jeden Verschluss in Funktion definiere und den Bogen kloniere, bevor ich ihn zum Verschluss gebe, gibt es eine andere Option?

Antwort

10

Es gibt keinen Weg um ihn herum. Sie sollten die Arc klonen, bevor sie in einem Verschluss verwendet wird. Das gemeinsame Muster ist das geklonte Arc auf den gleichen Namen in einem verschachtelten Bereich neu zu binden:

let arc = Arc::new(1); 
{ 
    let arc = arc.clone(); 
    || { /* do something with arc */ } 
} 
{ 
    let arc = arc.clone(); 
    || { /* do something else with arc */ } 
} 

Diese in der Regel zusammen mit spawn() getan wird:

let arc = Arc::new(Mutex::new(SomeSharedData::new())); 
for _ in (0..NUM_THREADS) { 
    let arc = arc.clone(); 
    thread::spawn(move || { 
     let mut shared_data = arc.lock(); 
     shared_data.do_something(); 
    }); 
}