Lines Matching refs:SpinLock

13 …msp;DragonOS在`kernel/src/lib/spinlock.rs`文件中,实现了自旋锁。根据功能特性的略微差异,分别提供了`RawSpinLock`和`SpinLock`两种自旋锁。
30 ## 3. SpinLock - 具备守卫的自旋锁
32   `SpinLock`在`RawSpinLock`的基础上,进行了封装,能够在编译期检查出“未加锁就访问临界区的数据”、“忘记放锁”、“双重释放”等问题;并且,支持数据的内部可…
38 pub struct SpinLock<T> {
47 &emsp;&emsp;您可以这样初始化一个SpinLock
50 let x = SpinLock::new(Vec::new());
53 &emsp;&emsp;在初始化这个SpinLock时,必须把要保护的数据传入SpinLock,由SpinLock进行管理。
55 &emsp;&emsp;当需要读取、修改SpinLock保护的数据时,请先使用SpinLock的`lock()`方法。该方法会返回一个`SpinLockGuard`。您可以使用被保护的数据的成员函数…
60 let x :SpinLock<Vec<i32>>= SpinLock::new(Vec::new());
67 // 在此处,SpinLock是加锁的状态
70 // 由于上方的变量`g`,也就是SpinLock守卫的生命周期结束,自动释放了SpinLock。因此,在此处,SpinLock是放锁的状态
74 &emsp;&emsp;对于结构体内部的变量,我们可以使用SpinLock进行细粒度的加锁,也就是使用SpinLock包裹需要细致加锁的成员变量,比如这样:
78 pub data: SpinLock<data_struct>,
89 pub struct LockedMyStruct(SpinLock<MyStruct>);
94 &emsp;&emsp;`SpinLock`之所以能够实现编译期检查,是因为它引入了一个`SpinLockGuard`作为守卫。我们在编写代码的时候,保证只有调用`SpinLock`的`lock()…
100 &emsp;&emsp;请注意,`SpinLock`支持的编译期检查并不是万能的。它目前无法在编译期检查出“双重加锁”问题。试看这样一个场景:函数A中,获得了锁。然后函数B中继续尝试加锁,那么就造成…