范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Rust学习笔记(五十)共享状态的并发及用Sync和Send扩展并发

  第四十九篇我们学习了在多线程中使用通信来实现并发,这一篇学习使用共享内存的方式实现并发。 Rust支持通过共享状态来实现并发。Channel类似单所有权:一旦值的所有权转移至Channel,就无法使用它了。而共享内存并发类似于多所有权:多个线程可以同时访问同一块内存。 使用Mutex来每次只允许一个线程来访问数据
  Mutex是mutual exclusion(互斥锁)的缩写。在同一时刻,Mutex只允许一个线程来访问某些数据。 想要访问数据: 线程必须首先获得互斥锁(lock),lock数据结构是mutex的一部分,它能跟踪谁对数据拥有独占访问权 mutex通常被描述为:通过锁定系统来保护它所持有的数据 Mutex的两条规则在使用数据之前,必须尝试获取锁(lock) 使用完mutex所保护的数据,必须对数据进行解锁,以便于其它线程可以获取锁 Mutex的API
  通过Mutex::new(数据)来创建Mutex,Mutex是一个智能指针。访问数据前,通过lock方法来获得锁: 这个方法会阻塞当前线程 lock可能会失败 返回的是MutexGuard(智能指针,实现了Deref和Drop)
  例: use std::sync::{Mutex, MutexGuard};  fn main() {     let m = Mutex::new(5);      {         let mut num: MutexGuard = m.lock().unwrap();         *num = 6;//由于MutexGuard实现了Deref,所以可以使用*解引用     }//由于MutexGuard实现了Drop,所以离开作用域会被释放,这样就不用手动释放锁了。      println!("m = {:?}", m) } 多线程共享Mutex
  例: use std::{sync::{Mutex}, thread};  fn main() {     let counter = Mutex::new(0);     let mut handles = vec![];      for _ in 0..10{         let handle = thread::spawn(move || {             let mut num = counter.lock().unwrap();             *num += 1;         });         handles.push(handle)     }       for handle in handles {         handle.join();     }      println!("Result = {}", *counter.lock().unwrap()) }
  运行以上代码会报错,因为在第一个循环中,第一次进入循环时创建了线程,并把counter的所有权移动至闭包内了,那么剩下的循环就无法获得所有权了。 多线程的多重所有权,使用Arc来进行原子引用计数
  之前学过Rc可以使数据被多重引用,但是它只能在单线程下使用。 Arc和Rc类似,它可以用于并发场景。A:atomic原子的。 那么为什么所有的基础类型都不是原子的,为什么标准库类型不默认使用Arc。因为需要牺牲性能作为代价。Arc和Rc的API是相同的。
  例: use std::{     sync::{Arc, Mutex},     thread, };  fn main() {     let counter = Arc::new(Mutex::new(0));     let mut handles = vec![];      for _ in 0..10 {         let counter = Arc::clone(&counter);         let handle = thread::spawn(move || {             let mut num = counter.lock().unwrap();             *num += 1;         });         handles.push(handle)     }      for handle in handles {         handle.join().unwrap();     }      println!("Result = {}", *counter.lock().unwrap()) }
  运行代码输出10。 RefCell/Rc vs Mutex/Arc
  Mutex提供内部可变性,和Cell家族(比如RefCell)一样。 我们使用RefCell来改变Rc里面的内容;同样使用Mutex来改变Arc里面的内容。 注意:Mutex有死锁风险。 Send和Sync trait
  Rust语言的并发特性比较少,目前学的并发特性都来自标准库(而不是语言本身)。所以我们无需局限于标准库的并发,可以自己实现并发。 但在Rust语言中有两个并发的概念:td::marker::Sync和std::marker::Send这两个trait。 Send允许线程间转移所有权
  实现Send trait的类型可以在线程间转移所有权。Rust中几乎所有类型都实现了Send,但是Rc没有实现,所以它只能用于单线程。 任何完全由实现了Send的类型组成的类型也被标记为Send。除了原始指针之外,几乎所有基础类型都实现了Send。 Sync允许从多线程访问
  实现了Sync的类型可以安全的被多个线程引用。也就是说,如果T是Sync,那么&T就是Send,即引用可以被安全的送往另一个线程。 基础类型都是Sync,完全由Sync类型组成的类型也是Sync,但Rc不是Sync的;RefCell和Cell家族也不是Sync的。不过Mutex是Sync的。
  通常并不需要手动实现 Send 和 Sync trait,因为由 Send 和 Sync 的类型组成的类型,自动就是 Send 和 Sync 的。因为他们是标记 trait,甚至都不需要实现任何方法。他们只是用来加强并发相关的不可变性的。
  手动实现这些标记 trait 涉及到编写不安全的 Rust 代码,需要十分以及特别的小心。

一锁当关万夫莫开小益E206T天猫精灵AI双系统指纹锁前言好像一夜之间,指纹锁这个智能家具硬件一下子就风靡起来了,从开始的网上传播到如今到家家户户,尤其受到年轻人的追捧,小区现在只要是刚装修的,几乎门上都有一把智能指纹锁具。当然之所以赤膊鸡仔寻美食01篇寒冷冬日香烤全羊这次去的店是荷清水香烤全羊(关山佳园店)地址也非常好找,就在光谷关山大道旁边。PS武汉的小伙伴们可以去试试。到的时候差不多晚上6点左右,远远望去一排排的蒙古包一下子把思绪带到了天苍小巧时尚畅听无阻南卡LitePro真无线耳机前言蓝牙耳机算是消费级别的电子产品,因为价格便宜和日常使用的普及性,越来越受大家的喜欢,不管是日常出行还是上下班通勤,人手一个蓝牙耳机早已经是大家屡见不鲜的事情了,可以负责地说,蓝手握30万购车预算,宝马奔驰等豪华紧凑型SUV该怎么选?总有朋友问,手握30万购车预算,豪华紧凑型SUV该怎么选?对于有生活品味的消费者来说,他们买车更偏向有个性品质与紧跟潮流的车型。今天,我们就带来宝马X1奔驰GLA和凯迪拉克XT4,解密比亚迪海豚不只美在天然上,还美在灵魂上文朱可夫车图腾出品,未经许可,谢绝转载汽车的命名,德国人严谨刻板,车系编号整齐划一,就像军队那样井井有条还有些品牌喜欢使用隐喻,气候地貌节日皆可成为灵感之源。以往,中国品牌普遍选择运动化外观,搭载代客泊车系统长安C385纯电轿车或明年上市日前,网络上曝光了一组长安C385的新车路试谍照。据悉,该车已于8月亮相,采用运动化的造型设计,并搭载智能网联科技,或将于明年正式上市。新车的整体设计流畅,分体式大灯设计配合雾灯区综合续航1090km2022款比亚迪宋ProDMi预计12月上市,或15万起售近日,据相关媒体报道称,2022款比亚迪宋ProDMi预计将于11月开启预售,新车将于12月正式上市,售价或15万起。据悉,该车的百公里油耗为4。4L,综合续航里程为1090km。深圳莲花山上,春天的故事莲花山公园主峰建有4000平方米的山顶广场,是深圳市内最高的室外广场。山顶广场中央矗立着改革开放总设计师同志的塑像,塑像高6米,基座高3。68米,重7吨,为青铜铸造。亲自为铜像题字大疆御2专业版Mavic2Pro开箱评测给大疆御2专业版拍了一组开箱照(华为P20Pro拍摄),2000万像素1英寸大底CMOS感光元件,感光面积是华为P20Pro的2。9倍,底大一级压死人,可拍摄10bitDlogM色高端专业VTR9000智能语音,你了解吗?科技改变生活,每一次创新都将带给我们无限的惊喜。于618当日,飞利浦智能音视频设备正式打通高端录音新品VTR9000线上开售平台,其中全新型技术概念的整合让很多人耳目一新,精美的外飞利浦正式发布多款专业商用级会议视讯设备2020年9月4日下午,飞利浦宣布推出多款全系列会议视讯摄录终端产品,包括4款音视频摄录软硬一体机2款立体拾音设备以及1款智能会议集成终端设备。全系列均为高端商用级标准,提供高清影
水滴屏配联发科芯片,三星GalaxyA23入门新机曝光,白色版挺好看在安卓高端手机市场一骑绝尘的三星,它是如何做到不依靠国内手机市场成为全球第一的呢?答案很简单,那就是它的走量机型还是要靠其它产品线的。说起三星,不少国内消费者可能最先想到的是Boo支付宝推荐的车险能买吗?可以的。大牌和小牌都有。根据需要自己选择险种。如果你来本地也能找到门路,(一般人也能找到门路,有返点的。)就不必在那上面去买。没有在支付宝上填车牌号的,千万不要再去填了。前几个月我企业设备如何实现信息化管理?每个公司都有各种各样的设备,但关于设备管理总有很多的问题如何将这么多设备有条理地管理起来?如何记录设备的生命周期?如何建立设备档案?下面告诉你如何用简道云解决设备管理难题。第一步统如何看待荣耀公司诉某测评博主云评测诋毁,侵害名誉权案判决,赔偿86698元?云测评的行为,可以说是一种欺骗粉丝,不负责任的行为。作为一名测评博主,未实际测评就直接给出论断谁买谁傻,是极其不负责任的行为。该博主在发布转载的微博时,并未完整客观地呈现所转载的原一加手机真的可以边玩边充吗?电池不会损害吗?包括一加在内的所有安卓机和iPhone,都是可以边玩边充的,不会对电池造成直接的损害,但会间接影响电池的寿命。我们现在使用的智能手机,基本都采用了锂电池,这种电池可以在20到45的两个虎年(19982022)之间的手机使用史公元1998年,那是一个虎年。那年春晚最轰动的一首歌,是王菲与那英合唱的相约九八。多年后,开心麻花的夏洛特烦恼爆红,主角穿越回1998,还向这届春晚和这首歌致敬。那一年,我在北京。苹果iphonese3真机曝光外观设计几乎没变化据此前报道,苹果将于今年3月召开第一场新品发布会,包含iPhoneSE3iPadAir5在内的诸多新品即将发布。今日外媒曝光了小屏手机iPhoneSE3的真机图,新机在外观设计方面华为新规更新,增加多款产品皆可升级,意味着新品还是有缺陷?对于现在手机市场上的消费者来说,因为手机产品的使用寿命大幅度增加,在手机市场上消费者对于手机的存储空间的要求也在逐渐的加大了,尤其是中高端手机市场产品,在现在市场上产品表现参差不齐全球电视销量座次排定前15名中国品牌占8席,小米力压索尼创维去年,中国彩电零售量为3835万台,同比下降13。8,创下近12年来最低。全球彩电市场也受到影响,出货量同比下降6至1。745亿台(奥维睿沃数据),为近六年来最低点。其中,北美欧洲手机在华为专卖店更新系统,丢失近400万的经济数据谁来赔?这么值钱的经济数据,不会存到云端,不会定时转存其它地方,不会更新前保存?就像挑了两框瓷器,使劲往人堆里挤,摔破了怪路人。自己不觉得有照顾好自己财务的义务吗?谁来陪,即便去法院,华为微信收款商业版是怎么回事?如何开通?微信收款商业版是一款可自助开通完全免开发无技术门槛的微信支付官方收款综合经营类产品,主要具有围绕二维码支付收款门店经营管理活动营销等方面的丰富功能,支持顾客使用信用卡支付。微信收款