"""设计场景:timo先说一句,亚索再说一句timo: timo队长正在待命yasuo: 面对疾风吧timo: timo整装待发yasuo: 哈杀gay """我们最先想到就是使用Lock一人轮流说一句,看下效果:
实际下效果发现好像不一样:
那么如何控制他们按照合理的顺序去你说一句我回答一局好像聊天一样呢:
那么就需要引进条件锁:
什么是条件锁:
条件变量总是与某种锁定相关联。可以传入,也可以默认创建一个。当多个条件变量必须共享同一锁时,传递一个输入很有用。锁是条件对象的一部分:您不必单独跟踪它。
条件变量遵循上下文管理协议:使用该with
语句在封闭块的持续时间内获取关联的锁。该acquire()
和 release()
方法也调用相关的锁的相应方法。
必须使用关联的锁来调用其他方法。该 wait()
方法释放该锁,然后阻塞直到另一个线程通过调用notify()
或 唤醒它notify_all()
。唤醒后,wait()
重新获取锁并返回。也可以指定超时。
该notify()
方法唤醒等待条件变量的线程之一(如果有的话)。该notify_all()
方法唤醒所有等待条件变量的线程。
注意:notify()
和notify_all()
方法不会释放锁;这意味着唤醒的一个或多个线程不会wait()
立即从其调用中返回,而仅在调用notify()
或notify_all()
最终放弃该锁的所有权的线程中返回。
典型的使用条件变量的编程风格使用锁来同步对某些共享状态的访问。对状态的特定更改感兴趣的线程会wait()
反复调用,直到看到所需的状态为止;而对状态调用进行修改的线程notify()
或notify_all()
更改状态的线程可能会成为其中一个等待者所需的状态,则线程会反复调用 它们。例如,以下代码是具有无限缓冲区容量的一般生产者-消费者情况:
实现应答效果:
来源:https://www.cnblogs.com/SunshineKimi/p/12313466.html