2016-08-19 8 views
1

私は、ハッシュがありますHashMapから削除するスレッドと挿入するスレッドをどうやって作るのですか?

let mut hash: HashMap<String, Vec<i32>> = HashMap::new(); 

を、私はスレッドを開始:

thread::spawn(move || delete_from(&mut hash)); 

fn delete_from(m: &mut HashMap<String, Vec<i32>>) { 
    loop { 
     m.remove(a_key) 
    } 
} 

これは素晴らしい作品。私はsleepステートメントをそこに持っていて(図示せず)、それは正しくa_keyを作り、それをHashMapから削除します。私はそれを印刷するときにスレッドがゆっくりと各アイテムを削除するのを見ることができます。

thread::spawn(move || insert_into(&mut hash)); 

fn insert_into(m: &mut HashMap<String, Vec<i32>>) { 
    loop { 
     m.insert(a_string, a_vector); 
    } 
} 

挿入されています

は、私は2番目のスレッドを開始します。私は私が得る第二のスレッドを追加するときしかし:移動値の

キャプチャ:hash [E0382]

これを設定する正しい方法は何ですか?

The complete code

答えて

6

これはそのままですが、ハッシュマップは最初のスレッドに移動されるため、他のスレッドはそのスレッドにアクセスできません。複数のスレッドがマップにアクセスできるように、共有オーナーシップにはArcが必要です。同時に、両方のマップが同時に変更されないように、同期のためにMutexが必要です。 Uに感謝し、私は今、ようやく錆を理解し、

use std::sync::{Arc, Mutex}; 

let hash: Arc<Mutex<HashMap<String, Vec<i32>>>> = Arc::new(Mutex::new(HashMap::new())); // initialize the map within an Arc (for sharing) and a Mutex (for synchronization) 
let clone1 = hash.clone(); // clone the Arc so it can be owned jointly by multiple threads 
let clone2 = hash.clone(); // clone the Arc so it can be owned jointly by multiple threads 

thread::spawn(move || delete_from(&clone1)); 
thread::spawn(move || insert_into(&clone2)); 

fn delete_from(m: &Mutex<HashMap<String, Vec<i32>>>) { 
    loop { 
     m.lock().unwrap().remove(a_key); // lock the mutex, remove a value, unlock 
    } 
} 

fn insert_into(m: &Mutex<HashMap<String, Vec<i32>>>) { 
    loop { 
     m.lock().unwrap().insert(a_string, a_vector); // lock the mutex, insert a value, unlock 
    } 
} 
+0

ああ:ここ

は、それがどのように見えるかです。それが私が見逃していた情報の最後の部分でした。 –

関連する問題