Переместить переменную в закрытие потока - PullRequest
0 голосов
/ 17 мая 2019

Я пытаюсь выяснить, как решить эту проблему, где я использую structopt для доступа к параметрам командной строки и затем передаю их для дальнейшей обработки:

fn main() {
    let opt = Opt::from_args();

    for _ in 0..opt.threads {
        GLOBAL_THREAD_COUNT.fetch_add(1, Ordering::SeqCst);
        thread::spawn(move || {
            // We need to catch panics to reliably signal exit of a thread
            let result = panic::catch_unwind(move || {
                // do some work
                worker(opt.iterations);
            });
            // process errors
            match result {
                _ => {}
            }
            // signal thread exit
            GLOBAL_THREAD_COUNT.fetch_sub(1, Ordering::SeqCst);
        });
    }
    // Wait for other threads to finish.
    while GLOBAL_THREAD_COUNT.load(Ordering::SeqCst) != 0 {
        thread::sleep(Duration::from_millis(1));
    }
}

ошибка:

error[E0382]: use of moved value: `opt`
  --> src/main.rs:80:23
   |
74 |     let opt = Opt::from_args();
   |         --- move occurs because `opt` has type `Opt`, which does not implement the `Copy` trait
...
80 |         thread::spawn(move|| {
   |                       ^^^^^^ value moved into closure here, in previous iteration of loop
...
84 |                 worker(opt.iterations); // TODO: make configurable (in database)
   |                        --- use occurs due to use in closure

Я понимаю, что право собственности вызывает проблему, но использование &opt.iterations вместо этого не помогает, и это в основном конец моих (ограниченных) знаний о ржавчине.

Мне нужно передать этот параметр в реальную рабочую функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...