私はRefCell
を作成し、単一スレッドにそのRefCell
への参照を渡したいコードしている:、私はに埋め込まれRefCell
を持っているタイプの完全なコードではSyncを実装していないタイプが実際にスレッド間で安全に共有できることを保証する方法を教えてください。
extern crate crossbeam;
use std::cell::RefCell;
fn main() {
let val = RefCell::new(1);
crossbeam::scope(|scope| {
scope.spawn(|| *val.borrow());
});
}
使用していますそれは(typed_arena::Arena
)です。私はcrossbeamを使用して、スレッドがそれが取る参照を失うことがないようにしています。
これはエラーを生成します。
error: the trait bound `std::cell::RefCell<i32>: std::marker::Sync` is not satisfied [E0277]
scope.spawn(|| *val.borrow());
^~~~~
私はこのエラーが発生した理由を私は理解して信じている:RefCell
が複数のスレッドから同時に呼び出されるように設計されており、それは内部可変性を使用しているため、必要の通常のメカニズムではありません単一の変更可能な借用は、複数の同時アクションを防止しません。これはさえSync
に文書化されています。
Types that are not
Sync
are those that have "interior mutability" in a non-thread-safe way, such asCell
andRefCell
instd::cell
.
これは私が1つのスレッドだけRefCell
にアクセスすることが可能であることを知って、すべてが順調と良いですが、この場合で。どのように私は私がやっていることを理解し、これが事実であることを確認することをコンパイラに肯定することができますか?もちろん、これが実際に安全であるという私の推論が間違っていれば、私は理由を伝えるのが嬉しいです。
'RefCellが' 'Send'を実装しているためこれが許可されています。 –
bluss