条件锁Condition
"""
设计场景: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()
更改状态的线程可能会成为其中一个等待者所需的状态,则线程会反复调用 它们。例如,以下代码是具有无限缓冲区容量的一般生产者-消费者情况:
实现应答效果:
条件锁Condition的更多相关文章
- 条件锁condition与Queue()
在学习之前你应该先了解锁和队列基础 import queue import time import random import threading import asyncio import logg ...
- 死磕 java同步系列之ReentrantLock源码解析(二)——条件锁
问题 (1)条件锁是什么? (2)条件锁适用于什么场景? (3)条件锁的await()是在其它线程signal()的时候唤醒的吗? 简介 条件锁,是指在获取锁之后发现当前业务场景自己无法处理,而需要等 ...
- java并发多线程显式锁Condition条件简介分析与监视器 多线程下篇(四)
Lock接口提供了方法Condition newCondition();用于获取对应锁的条件,可以在这个条件对象上调用监视器方法 可以理解为,原本借助于synchronized关键字以及锁对象,配备了 ...
- python线程condition条件锁应用实例
import time import threading # 吃火锅鱼丸 guo = [] suo = threading.Condition() #条件锁 # 生产者负责生产 class Produ ...
- python线程条件变量Condition(31)
对于线程与线程之间的交互我们在前面的文章已经介绍了 python 互斥锁Lock / python事件Event , 今天继续介绍一种线程交互方式 – 线程条件变量Condition. 一.线程条件变 ...
- Python的条件锁与事件共享
1:事件机制共享队列: 利用消息机制在两个队列中,通过传递消息,实现可以控制的生产者消费者问题要求:readthread读时,writethread不能写:writethread写时,readthre ...
- 深入理解java:2.3.2. 并发编程concurrent包 之重入锁/读写锁/条件锁
重入锁 Java中的重入锁(即ReentrantLock) 与JVM内置锁(即synchronized)一样,是一种排它锁. ReentrantLock提供了多样化的同步,比如有时间限制的同步(定 ...
- 关于一点pthread_cond_t条件锁的思考以及实验
转:http://blog.csdn.net/aniao/article/details/5802015 APUE上,关于条件锁.其中有这么几条总结: 1.使用条件锁前必须先锁住对应的互斥锁. 2.条 ...
- Linux 开发之线程条件锁那些事
2019独角兽企业重金招聘Python工程师标准>>> 条件锁即在一定条件下触发,那什么时候适合用条件锁呢,那当然是你在等待一个符合的条件下触发.一个常用的例子就是在线程中无限循环执 ...
随机推荐
- dmock 基于Django的轻量级Mock平台
GitHub:https://github.com/yjlch1016/dmock # dmock 基于Django的轻量级Mock平台 dmock即Django+Mock的缩写 一.思路: mock ...
- 测试.NET core MiddleWare 运行逻辑
话不多说,直接开整. 首先创建一个.NET CORE web 工程,创建完成之后,会自动创建相关文件如图(本示例基于.NET CORE 3.0): 打开Startup.cs可以看到在Configure ...
- BloodHound可视化之域分析
一.简介 BloodHound是一款将域内信息可视化的单页的web应用程序,是一款在域内进行信息收集的免费工具: bloodhound通过图与线的形式,将域内用户.计算机.组.会话.ACL以及域内所有 ...
- PAT甲级代码仓库
大道至简,知易行难.希望能够坚持刷题. PAT甲级真题题库,附上我的代码. Label Title Score Code Level 1001 A+B Format 20 1001 * 1002 A+ ...
- import,export深入理解
export 最正常: var firstName = 'Michael'; var lastName = 'Jackson'; var year = 1958; export { firstName ...
- CSP-J2019被虐记
-------------------------------------- (我菜到连背包都不会) ------------------------------------- 回首一想,今年的pj还 ...
- 剑指offer-面试题52-两个链表的第一个公共节点-链表
/* 题目: 求两个链表的第一个公共节点. */ /* 思路: 见代码. */ #include<iostream> #include<cstring> #include< ...
- Mac上的屏幕截图不起作用该如何修复?
屏幕截图是Mac提供的内置功能,很少有它不起作用.但是由于某些意外的设置或硬件问题,Mac上的屏幕截图有时无法正常工作,这里提供的是Mac上的屏幕截图不起作用该如何修复? 1.在Mac上启用屏幕快照快 ...
- 输入python -m pip install --upgrade pip更新pip版本失败的解决办法
突然发现输入 python -m pip install --upgrade pip 无法升级pip,试了很多种其他更新pip的命令之后还是无效,遂采用简单暴力的解决办法 首先,直接输入pip uni ...
- 【NLP】暑假课作业1 - 中文分词(前向匹配算法实现)
作业任务: 使用98年人民日报语料库进行中文分词训练及测试. 作业输入: 98年人民日报语料库(1998-01-105-带音.txt),用80%的数据作为训练集,20%的数据作为验证集. 运行环境: ...