How can I guarantee that a type that doesn't implement Sync can actually be safely shared between threads?

前端 未结 2 1683
甜味超标
甜味超标 2020-12-04 02:09

I have code that creates a RefCell and then wants to pass a reference to that RefCell to a single thread:

use cros         


        
2条回答
  •  隐瞒了意图╮
    2020-12-04 02:36

    Another solution for this case is to move a mutable reference to the item into the thread, even though mutability isn't required. Since there can be only one mutable reference, the compiler knows that it's safe to be used in another thread.

    use crossbeam; // 0.7.3
    use std::cell::RefCell;
    
    fn main() {
        let mut val = RefCell::new(1);
        let val2 = &mut val;
    
        crossbeam::scope(|scope| {
            scope.spawn(move |_| *val2.borrow());
        })
        .unwrap();
    }
    

    As bluss points out:

    This is allowed because RefCell implements Send.

提交回复
热议问题