rust-based-os-comp2022 icon indicating copy to clipboard operation
rust-based-os-comp2022 copied to clipboard

[Question] 为什么第八章 并发中的condvar.wakup不直接带上mutex?

Open nkbai opened this issue 3 years ago • 1 comments

在 https://learningos.github.io/rust-based-os-comp2022/chapter8/4condition-variable.html 中, conditional variable 的wakeup函数是不带任何参数的,例如:

unsafe fn first() -> ! {
     mutex.lock();
     A=1;
     condvar.wakup();
     mutex.unlock();
 
 }

为什么不直接设计成下面的样子呢?

unsafe fn first() -> ! {
     mutex.lock();
     A=1;
/*
     condvar.wakup();
     mutex.unlock();
  这两句话,替换成下面的一句
*/
     condvar.wakup(mutex);
 
 }

好处是,避免了second被唤醒以后,发现获取不到锁而再次休眠。

nkbai avatar Jul 29 '22 09:07 nkbai

老的写法是希望直观地表达通过条件变量实现同步是需要互斥锁的。

而你的写法 condvar.wakup(mutex); 虽然少了一条语句,但并没有直观表达出何时执行unlock(mutex)操作的过程。 如果把wakup(mutex)的实现也写出来,那和老的两步的写法也没啥差别了。

所以,我个人觉得老的写法相对比较直观。

在 https://learningos.github.io/rust-based-os-comp2022/chapter8/4condition-variable.html 中, conditional variable 的wakeup函数是不带任何参数的,例如:

unsafe fn first() -> ! {
     mutex.lock();
     A=1;
     condvar.wakup();
     mutex.unlock();
 
 }

为什么不直接设计成下面的样子呢?

unsafe fn first() -> ! {
     mutex.lock();
     A=1;
/*
     condvar.wakup();
     mutex.unlock();
  这两句话,替换成下面的一句
*/
     condvar.wakup(mutex);
 
 }

好处是,避免了second被唤醒以后,发现获取不到锁而再次休眠。

chyyuu avatar Jul 29 '22 15:07 chyyuu