Проблемы с владением и заимствованием, а также с совместным использованием экземпляра в нескольких потоках

Я пытаюсь изучить Rust с помощью игрушечного проекта под названием workers. Я пытаюсь запустить task.perform() внутри пула потоков.

Проблема:

    Compiling workers v0.1.0 (file:///Users/endel/Projects/rust/workers)
src/lib.rs:45:21: 45:32 error: cannot infer an appropriate lifetime for autoref due to conflicting requirements
src/lib.rs:45     let next = self.next_task();
                                  ^~~~~~~~~~~
src/lib.rs:45:16: 45:20 note: first, the lifetime cannot outlive the expression at 45:15...
src/lib.rs:45     let next = self.next_task();
                             ^~~~
src/lib.rs:45:16: 45:20 note: ...so that auto-reference is valid at the time of borrow
src/lib.rs:45     let next = self.next_task();
                             ^~~~
src/lib.rs:45:16: 45:32 note: but, the lifetime must be valid for the method call at 45:15...
src/lib.rs:45     let next = self.next_task();
                             ^~~~~~~~~~~~~~~~
src/lib.rs:45:16: 45:20 note: ...so that method receiver is valid for the method call
src/lib.rs:45     let next = self.next_task();
                             ^~~~
error: aborting due to previous error

Я обратился за помощью в IRC-канал #rust, и они предложили использовать Box<Task> (принадлежащий) вместо &Box<Task> (заимствованный), чтобы скопировать задачу во время оператора move || {}, я полагаю.

Это жизнеспособное решение? Есть какой-нибудь другой? Я попытался изменить методы реализации Worker с &self на self, но начинают появляться другие проблемы, и я не могу получить собственный Box<Task> для своего метода work.

Вот упрощенная версия на площадке, демонстрирующая проблему.


person Endel    schedule 05.09.2015    source источник
comment
Создайте MCVE, воспроизводящий вашу проблему. В идеале запустите его на Rust Playground. Включите этот код в свой вопрос, иначе он может быть закрыт. Акцент на М; не принято публиковать сотни строк кода.   -  person Shepmaster    schedule 06.09.2015
comment
Спасибо @Shepmaster, я добавил ссылку на игровую площадку в вопросе, все в порядке?   -  person Endel    schedule 06.09.2015
comment
@Endel: намного лучше, спасибо.   -  person Matthieu M.    schedule 06.09.2015


Ответы (1)


Я спросил об этом на IRC-канале #rust, и Томака ответила мне.

В принципе:

  • Изменено &Box<Task> на Box<Task>
  • get_task_by_name теперь удаляет элемент из Vec
  • Vec теперь находится внутри мьютекса, так что вы можете изменить его
person Endel    schedule 06.09.2015