我确定互斥是不够的,这就是条件变量概念存在的原因; 但它打败了我,当一个条件变量必不可少时,我无法用一个具体的场景来说服自己.
条件变量,互斥锁和锁定问题的接受答案之间的区别是条件变量是a
锁定"信号"机制.当线程需要等待资源变得可用时使用它.线程可以在CV上"等待",然后资源生成器可以"发出信号"变量,在这种情况下,等待CV的线程会得到通知并可以继续执行
我感到困惑的是,一个线程也可以在互斥锁上等待,当它被发出信号时,只是意味着该变量现在可用,为什么我需要一个条件变量?
PS:此外,无论如何,需要一个互斥锁来保护条件变量,当我的视力更加偏向于看不到条件变量的目的时.
multithreading synchronization operating-system mutex condition-variable
我对条件变量的工作方式(在共享数据并发访问方面)的理解有些困惑
以下是伪C代码,以说明我当前的问题
// Thread 1: Producer
void cakeMaker()
{
lock(some_lock);
while(number_of_cakes == MAX_CAKES)
wait(rack_has_space);
number_of_cakes++;
signal(rack_has_cakes);
unlock(some_lock);
}
// Thread 2: Consumer
void cakeEater()
{
lock(some_lock);
while(number_of_cakes == 0)
wait(rack_has_cakes);
number_of_cakes--;
signal(rack_has_space);
unlock(some_lock);
}
Run Code Online (Sandbox Code Playgroud)
可以说我们目前有number_of_cakes = 0,所以Thread 2目前仍停留在此wait(rack_has_cakes)。Thread 1运行并number_of_cakes以1 递增。然后它开始signal(rack_has_cakes)-唤醒Thread 2,不幸的Thread 2是在Thread 1调用之前唤醒unlock(some_lock),因此它再次回到睡眠状态,并且信号已丢失。
我对wait和的内部运作感到非常困惑signal。他们到底发生了什么?它们是否像某个布尔标志,当我们调用signal时将其自动设置为1并在等待成功时再次将其设置为0?到底是怎么回事?