1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Arc<impl trait>をスレッドに渡す方法

Last updated at Posted at 2022-04-23

結論

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ググったら自分で実装するべきではないとか書いてあってそれも誤解したりしたせいでめちゃくちゃハマってしまった。

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?