Open utterances-bot opened 6 months ago
let mut mutex_inner = self.inner.exclusive_access();
这里可否理解为,我们真正防止竞争的机制是 Rust Core 提供的数据结构?
楼上没搞明白啊... 我们作为操作系统层,是向下提供服务的,和用户层没关系啊,况且 exclusive_access()
只是提供内部可变性用的而已...
我在考虑的是,有多个线程在多个核心上同时运行的时候,如何保证一个互斥锁不同时被两个线程获取
@YfLi03 我觉得应该是的,通过.inner_exclusive_access()保证不会有其它线程访问到Mutex的locked值。因为我没看到其它的特定的atomic指令。
并不是,从最硬件层面看,我们的操作系统所有代码都是串行的,所以不存在竞争的问题。 但对于用户来讲,线程的调度是透明的,可能会产生意外的顺序问题导致数据竞争。 真正防止竞争的机制是用户手动使用系统调用加锁,防止竞争的逻辑是由用户负责的,我们的操作系统只提供了锁的接口,并不自动分析资源并保证不发生竞争。
(再说了exclusive_access是自己实现的,里面就是个borrow_mut)
我的问题是:如何避免两个线程同时调用 sys_mutex_lock,导致 mutex 内部的数据结构自身出现竞争现象;
在单核的情况下,由于我们进入了 kernel mode 自然关了中断,这个是显然的;
在多核的情况下,我没有看到其他机制可以确保避免这一情况。
锁机制 - rCore-Tutorial-Guide-2024S 文档
https://learningos.cn/rCore-Tutorial-Guide-2024S/chapter8/2lock.html