Как я могу отправить нестатические данные в поток в Rust и нужно ли это в этом примере? - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь запустить новый поток, используя некоторые данные кучи в Rust, и получаю кучу ошибок, связанных с необходимостью существования данных 'static.Я прошел путь назад в своей программе, но столкнулся с проблемой.

use std::sync::Arc;
use std::thread;

struct ThreadData {
    vector_of_strings: Vec<String>,
    terms: Vec<&'static str>,
    quotient: usize,
}

fn perform_search(slice: &[String], terms: &[&str]) {
    /* ... */
}

fn threaded_search(td_arc: &Arc<ThreadData>) {
    let no_of_lines = td_arc.vector_of_strings.len();
    let new_tda1 = td_arc.clone();

    let strings_as_slice1 = new_tda1.vector_of_strings.as_slice();   

    thread::spawn(move || {
        perform_search(&strings_as_slice1[0..td_arc.quotient], &new_tda1.terms);
    });
}

fn main() {
    let td = ThreadData {
        vector_of_strings: Vec::new(),
        terms: Vec::new(),
        quotient: 0,
    };

    let td_arc = Arc::new(td);
    threaded_search(&td_arc);
}

Ошибка:

error[E0621]: explicit lifetime required in the type of `td_arc`               
  --> src/main.rs:20:5                                                         
   |                                                                           
14 | fn threaded_search(td_arc: &Arc<ThreadData>) {                            
   |                            ---------------- help: add explicit lifetime `'static` to the type of `td_arc`: `&'static std::sync::Arc<ThreadData>`
...                                                                            
20 |     thread::spawn(move || {                                               
   |     ^^^^^^^^^^^^^ lifetime `'static` required

1 Ответ

0 голосов
/ 07 октября 2018

Ошибка, связанная с 'static, связана с тем, что новый поток, созданный в thread::spawn, может пережить вызов threaded_search, во время которого поток создается изначально, что означает, что потоку не должно быть разрешено использовать какие-либо локальные переменные из threaded_search с временем жизни короче 'static.

В вашем коде новый поток ссылается на strings_as_slice1 и td_arc.

Обычно с thread::spawn и Arc вызахочет перенести владение одним счетчиком ссылок в поток и получить доступ к потоку, что ему нужно, через указатель с подсчетом ссылок, а не непосредственно из внешней кратковременной области.

fn threaded_search(td_arc: &Arc<ThreadData>) {
    // Increment reference count that we can move into the new thread.
    let td_arc = td_arc.clone();

    thread::spawn(move || {
        perform_search(&td_arc.vector_of_strings[0..td_arc.quotient], &td_arc.terms);
    });
}
...