多线程下的原语,除了我们常用的锁,还有另外一类用于同步的原语叫做“屏障”,“条件变量”(在rust或者cpp中)。在其他语言中也有类似的概念,叫做栅栏,闭锁,屏障,信号量等。他们具有相同的意义。 在介绍条件变量之前,先介绍屏障(Barrier)。屏障相当于一堵带门的墙,使用wait方法,在某个点阻塞全部进入临界区的线程。条件变量(Condition Variable)和屏障的语义类似,但它不是阻塞全部线程,而是在满足某些特定条件之前阻塞某一个得到互斥锁的线程。 单纯讲条件变量的意义并不直观。换种描述。 条件变量可以在我们达到某种条件之前阻塞线程,我们利用此特性可以对线程进行同步。或者说做到按照某种条件,在多个线程中达到按照特定顺序执行的目的。 为此我们设计如下下面流程。为此流程写一段代码,来体会条件变量的作用。 我们启动三个线程,t1,t2,t3。分别执行任务T1,T2,T3。现在要求:T2必须等待T1和T3完成之后再执行。 以上代码可以在?这个链接(https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=31292aa4c8c86b93f4111597679329e2)?下在playground运行。 上面的代码需要注意的点如下: CondVar需要和锁一起使用,在运行中每个条件变量每次只可以和一个互斥体一起使用。 这里使用了parking_lot中的CondVar和Mutex,使用标准库中的条件变量和锁也是一样的效果。 设计中,在锁中持有了一个数字类型。当锁中的数字(也就是我们的“变量”)小于5,我们使用wait阻塞住t2。我们在t1完成时,把数字加二,在t3完成后,我们把数字加三。 注意,每次更改变量后要使用通知。 一般情况下,我们可以设计更复杂的变量和阻塞条件来达到更复杂的同步效果。 特别注意的是
所以使用的时候需要特别注意两种通知不同的使用场景,避免造成阻塞。 在CondVar中还有对应的wait_for。可以设置TimeOut,避免造成永久的阻塞。 持续支持去中心化企业供应链合约交易 GitHub开源链接 区块链数据协议层:https://github.com/scryinfo/dp 组件Dot:https://github.com/scryinfo/dot 基础库:https://github.com/scryinfo/scryg Cashbox: https://github.com/scryinfo/cashbox city_client: https://github.com/scryinfo/city_client city_server:?https://github.com/scryinfo/city_server 下载 Cashbox: https://cashbox.scry.info/cashbox/api/apk/downloadlatest —- 编译者/作者:scry 玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。 |
SCRY技术分享:多线程原语ConVar
2021-04-23 scry 来源:区块链网络
LOADING...
相关阅读:
- 荷西论币4.23凌晨比特币思路简析2021-04-23
- 去中心化交易所MyTrade正式登陆HECOChain2021-04-23
- Filecoin每周进度总结丨与以太坊、NFT生态的交互2021-04-23
- Moondoge(月亮狗)完成500万美元的战略轮融资2021-04-22
- 币虎2021年4月22日17:30上线MBONK/USDT交易对2021-04-22