Как использовать статическую изменяемую ссылку в цикле с асинхронным перемещением?

У меня есть код с изменяемой ссылкой с временем жизни 'static, и я пытаюсь использовать его в цикле, который имеет async move:

fn baz(_s: &mut String) {
    // do something
}

fn main() {
    let bar: &'static mut String = Box::leak(Box::new("test".to_string()));
    loop {
        tokio::spawn(async move {
            baz(bar);
        });

        // some conditions here to exit from the loop
    }
}

Компилятор Rust предлагает повторное заимствование, но это синтаксически неверно, первый раз, когда я наткнулся на это:

error[E0382]: use of moved value: `bar`
  --> src/main.rs:8:33
   |
6  |       let bar: &'static mut String = Box::leak(Box::new("test".to_string()));
   |           --- move occurs because `bar` has type `&mut String`, which does not implement the `Copy` trait
7  |       loop {
8  |           tokio::spawn(async move {
   |  _________________________________^
9  | |             baz(bar);
   | |                 --- use occurs due to use in generator
10 | |         });
   | |_________^ value moved here, in previous iteration of loop
   |
help: consider creating a fresh reborrow of `bar` here
   |
8  |         tokio::spawn(async move &mut *{
   |                                 ++++++

Как я могу использовать эту изменяемую ссылку в таком цикле? Я борюсь против заимствования в цикле и async move хочу сделать копию/клон.

даже если вы слили это, вы можете иметь только &mut за раз, так что это никогда не сработает. Вы должны использовать какую-то синхронизацию, возможно, Mutex

Netwave 10.05.2022 18:36

Заполните ошибку для недопустимого предложения, пожалуйста.

Chayim Friedman 10.05.2022 18:44

@Netwave Спасибо. Вы абсолютно правы. Не думал об этом. Можете ли вы опубликовать ответ, чтобы я мог принять его.

Victor Ronin 10.05.2022 18:46

@ChayimFriedman Готово github.com/rust-lang/rust/issues/96908

Victor Ronin 10.05.2022 18:52
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
4
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете иметь только (один) &mut за раз, поэтому, чтобы использовать его в качестве общего ресурса, вам необходимо использовать какую-то синхронизацию. Здесь может пригодиться Mutex.

Другие вопросы по теме