什么时候只用互斥锁就可以,什么时候用条件变量+互斥锁

互斥锁的作用是确保在同一时刻只有1个线程访问共享资源

而条件变量的作用是,虽然某个线程加锁成功,可以访问共享资源了,但是这个时候如果某个条件没有变为true,那么这个线程也会被阻塞,直到其他线程调用notify_one来唤醒他,告诉他现在这个条件变为true了,他才可以访问共享资源

比如在生产者-消费者模型中,消费者加锁成功,获得了访问资源队列的资格,但是这时候资源队列有可能空的,如果只用互斥锁,那么我们需要先判断一下资源队列是否为空,如果为空的话就直接退出访问并释放锁。

然后线程再次循环访问,再次尝试加锁,又重复上面这个过程。。。

如果我们使用条件变量,将条件设置为队列不为空时等于true,那么当线程加锁成功,但条件变量为false(资源队列为空)时,线程就被阻塞。。。直到某个生产者线程往里面生产资源后,这个生产者线程在调用 notify_one 来唤醒其中一个被阻塞的消费者线程,相当于告诉他(还有个 notify_all 是所有被阻塞的线程都会被唤醒,但只有一个能加锁成功,其他则继续被阻塞)现在资源队列里有资源了,你可以来拿了,这时候消费者线程再去访问资源队列,就不会有上面循环访问的问题。

 

总结:

条件变量的作用是,在某些多线程场景中,即使线程互斥锁加锁成功,获得了访问共享资源的权限,但如果没有达到某些条件,那么访问了也没用,只有在某些条件为true的情况下访问才有效。

这个时候可以把这个条件设置为条件变量,条件变量为false时线程会被阻塞,条件为true时再通过notify_one接口来唤醒被阻塞的线程,可以防止线程重复进行无效访问。

 

posted @ 2023-06-11 19:10  大黑耗  阅读(44)  评论(0编辑  收藏  举报