#cell #unsafe #mutability #parallel

super_cell

一个超级(不安全)的单元格,无论内部类型的 send/sync 如何,都实现了 send 和 sync

2 个版本

0.1.1 2024 年 8 月 13 日
0.1.0 2024 年 8 月 13 日

#665 in Rust 模式

Download history 227/week @ 2024-08-12

每月 227 次下载

MIT 许可证

10KB
182

Super Cell

一个超级(不安全)的,修改了 Cell 类型以使其更方便,因此可能对可变类型引入了未定义的行为。可能存在未定义行为

  • 从引用产生的多个可变引用可能导致可能的竞态条件
  • 在单独的线程中进行并发修改,没有保证顺序
  • ...等等。

这把安全性留给了程序员,但一般来说,在我自己的项目中使用它,我还没有遇到过造成问题的时刻。

使用方法

use super_cell::*;

fn main() {
    // Mutable primitive
    let result = SuperCell::new(10);
    *result.get_mut() = 11;
    assert_eq!(*result.get(), 11); // OK
    assert_eq!(*result.get_mut(), 11); // OK

    // Mutable Complex Struct
    let result = SuperCell::new(Test {
        x: 0,
        list: vec![],
    });
    let mutable = result.get_mut();
    let mut list = vec![];
    mutable.x = 100;
    for i in 0..100 {
        mutable.list.push(i);
        list.push(i);
    }
    assert_eq!(result.get().x, 100); // OK
    assert_eq!(result.get().list, list); // OK
    assert_eq!(result.get_mut().x, 100); // OK
    assert_eq!(result.get_mut().list, list); // OK
    
    // Mutable Parallel/Async
    let result = SuperCell::new(10);
    thread::scope(|x| {
        let reference = result.get_mut();
        let handle = x.spawn(|| {
            sleep(Duration::from_millis(10));
            *reference = 11;
        });
        assert_eq!(*result.get(), 10); // OK
        assert_eq!(*result.get_mut(), 10); // OK
        handle.join().expect("Failed to join thread!");
        assert_eq!(*result.get(), 11); // OK
        assert_eq!(*result.get_mut(), 11); // OK
    });
    assert_eq!(*result.get(), 11); // OK
    assert_eq!(*result.get_mut(), 11); // OK
}

依赖项

~165KB