2015-06-01 4 views
2

Рассмотрите следующий код, я добавляю каждый из моих потоков в вектор, чтобы присоединиться к ним до основного потока после того, как я породил каждый поток, однако я не могу позвонить iter() на мой вектор JoinHandlers.Невозможно выполнить итерацию по Arc Mutex

Как я могу это сделать?

fn main() { 
    let requests = Arc::new(Mutex::new(Vec::new())); 
    let threads = Arc::new(Mutex::new(Vec::new())); 

    for _x in 0..100 { 
     println!("Spawning thread: {}", _x); 

     let mut client = Client::new(); 
     let thread_items = requests.clone(); 

     let handle = thread::spawn(move || { 
      for _y in 0..100 { 
       println!("Firing requests: {}", _y); 

       let start = time::precise_time_s(); 

       let _res = client.get("http://jacob.uk.com") 
        .header(Connection::close()) 
        .send().unwrap(); 

       let end = time::precise_time_s(); 

       thread_items.lock().unwrap().push((Request::new(end-start))); 
      } 
     }); 

     threads.lock().unwrap().push((handle)); 
    } 

    // src/main.rs:53:22: 53:30 error: type `alloc::arc::Arc<std::sync::mutex::Mutex<collections::vec::Vec<std::thread::JoinHandle<()>>>>` does not implement any method in scope named `unwrap` 
    for t in threads.iter(){ 
     println!("Hello World"); 
    } 
} 
+1

предоставьте [MCVE] (http://stackoverflow.com/help/mcve). В вашем коде отсутствуют все объяснения, какие библиотеки вы используете, и содержит информацию, не относящуюся к вашей проблеме. –

ответ

8

Во-первых, вам не нужно threads, которые должны содержаться в Arc в Mutex. Вы можете держать его просто Vec:

let mut threads = Vec::new(); 
... 
threads.push(handle); 

Это так, потому что вы не разделяете threads между, ну нитями. Вы получаете доступ к нему только из основного потока.

Во-вторых, если по какой-то причине вы сделать необходимость держать его в Arc (например, если ваш пример не отражает реальную структуру вашей программы, которая является более сложным), то вам нужно заблокировать мьютекс для получения ссылку на содержащийся вектор, как и при нажатии:

for t in threads.lock().unwrap().iter() { 
    ... 
} 
Смежные вопросы