In its essence, the Arc
and Mutex
wrapping is superfluous: you are passing a reference to something on the local stack. When you spawn a thread with std::thread::spawn
, there is nothing linking the lifetimes together; the main thread is quite at liberty to conclude and free anything in it—in this case, including a
—before any other threads it spawns even start executing; thus in this case a
could refer to freed memory by the time the spawned thread does anything, leaving c_clone
as a dangling pointer. This is why the environment of the closure of a spawned thread must be 'static
.