結論
trait Trait : Send + Sync + 'static{
fn func(&self);
}
これでスレッドに渡せるようになる。
fn spawn_thread(arg:impl Trait){
let arc = Arc::new(arg);
thread::spawn(move || arc.func());
}
Send + Sync + 'static をサブトレイトとして追加するだけ。
Traitの実装側では特に何もしなくて良い。
解説
SendとSyncはスレッド間でのデータ共有が出来ることを示すマーカートレイトで、'staticはメンバに参照が無いことを担保するstaticライフタイム境界と呼ばれる物らしい。
これらのトレイトが無いとスレッドにデータを送ろうとしても、安全性が担保されていないから拒否されるということだと思う。
そもそもスレッド間共有前提のArcがこれらが実装されていない型を許容してしまう仕様になっているのが、Arcでラップさえすればスレッド間で共有できるという誤解を招く原因な気がする。
ちなみに自分はこの答えにたどり着くのに3時間くらいかかりました。調べても斜め下の解決法ばっかり出てくるんだもん...(Arc<Trait>にimpl Traitしろとか)
結局ネットの情報は一切役に立たなかったのでエラーメッセージ読んで解決した。
ただ、エラーにはSend Syncを実装しろって書いてあるけど、それら実装してもまたエラー出てくるからこれじゃダメなのかと誤解したり、SendとSyncググったら自分で実装するべきではないとか書いてあってそれも誤解したりしたせいでめちゃくちゃハマってしまった。