Если вы посмотрите на thread::spawn
или thread::Builder::spawn
, вы увидите, что у него есть подпись
pub fn spawn<F, T>(f: F) -> JoinHandle<T>
where
F: FnOnce() -> T,
F: Send + 'static,
T: Send + 'static,
Это означает, что оба закрытие потока f
и его возвращаемое значение должны реализовывать черту Send
(т. е. быть отправляемой по потокам) и иметь время жизни 'static
(т. е. не иметь заимствований с незавершенным c время жизни.
Закрытие будет Send
, если все его захваченные переменные равны. Также будет 'static
, если все его захваченные переменные и все захваченные переменные перемещены в замыкание (что и делает ключевое слово move
).
Поскольку единственная захваченная переменная в твоем замыкании work_load
, вам нужно убедиться, что work_load
равно Send
и 'static
:
fn spawn<F>(work_load: F)
where
F: FnMut() + Send + 'static
// ^---.---^
// \_ add these constraints to F