当前位置: 首页 > news >正文

做淘宝那样的网站麻烦吗网站开发asp.net和sql数据库

做淘宝那样的网站麻烦吗,网站开发asp.net和sql数据库,上海 企业网站制,怎么提交网站关键词导航 Rust多线程交叉打印Send Sync特征讲解 一、Rust多线程交叉打印二、Send Sync 特征讲解 Rust多线程交叉打印Send Sync特征讲解 一、Rust多线程交叉打印 先说背景有两个线程#xff0c;分别为0号线程和1号线线程两个线程交叉打印共享值#xff0c;并将共享值1当标志为fa… 导航 Rust多线程交叉打印Send Sync特征讲解 一、Rust多线程交叉打印二、Send Sync 特征讲解 Rust多线程交叉打印Send Sync特征讲解 一、Rust多线程交叉打印 先说背景有两个线程分别为0号线程和1号线线程两个线程交叉打印共享值并将共享值1当标志为false时0号线程打印标志为true时1号线程打印要求0号线程先打印 我们看代码 use std::sync::{Arc, Condvar, Mutex}; use std::thread; static mut count: usize 0;//全局变量 fn main() {//互斥锁每次只让一个线程负责打印let mutex Arc::new(Mutex::new(false));//初始值为false//信号量实现线程同步即控制线程运行顺序let condvar Arc::new(Condvar::new());//让主线程等子线程执行完再推出let mut handles vec![];for i in 0..1 {//两个线程都应该持有同一个锁的所有权let cmutex Arc::clone(mutex);//两个线程都应该持有的事同一个信号量的所有权let ccondavar Arc::clone(condvar);let handle thread::spawn(move || {//上锁这个锁可能是0号线程先获得也有可能是1号线程,这段代码要求0号线程先打印所以我们下面通过信号量来实现let mut lock cmutex.lock().unwrap();//print!({}, *lock);for j in 0..2 {if i % 2 0 {if *lock {//当mutex持有的值为false时才轮到0号线程打印否则等待lock ccondavar.wait(lock).unwrap();}*lock true;//lock为false,0号线程可以打印一次然后设置为true是为了防止0号线程一直打印unsafe {//count 1;println!({} thread ouput : {}, i, count);}ccondavar.notify_one();//通知1号线程可以行动了} else {if !*lock {//当mutex持有的值为true时才轮到1号线程打印否则释放lock然后等待lock ccondavar.wait(lock).unwrap();}*lock false;//lock为true时,0号线程可以打印一次然后这里设置为false是为了防止0号线程一直打印unsafe {count 1;println!({} thread ouput : {}, i, count);}ccondavar.notify_one();//通知0号线程可以行动了}}});handles.push(handle);}for handle in handles {handle.join().unwrap();}}运行一下 0 thread ouput : 1 1 thread ouput : 2 0 thread ouput : 3 1 thread ouput : 4 0 thread ouput : 5 1 thread ouput : 6可以看到我们已经实现了交叉打印其实我们可以假想一下如果一开始1号线程先抢到了Mutex1号线程会先打印吗答案是不会的因为我们通过设置mutex的值为false并在1号线程逻辑中的代码控制了代码如下 if !*lock {//当mutex持有的值为true时才轮到1号线程打印否则释放lock然后等待lock ccondavar.wait(lock).unwrap();}可以看到如果lock的初始值为false信号量通过wait函数释放了这个锁所以哪怕1号线程在最开始抢到了锁也会在这里释放掉让0号线程先打印 二、Send Sync 特征讲解 在Rust中有一个很重要的机制就是所有权机制值的赋值行为很有可能导致一个值移动来移动去使得在Rust的多线程编程中变得很难管理。 于此同时多线程编程中多个线程使用(拥有一个所有权)同一个变量的场景也是非常常见的因为Rust提出了一个Rc和Arc。 Rc和Arc一个共同特征: 能够让一个值能有多个拥有者即一个值产生了多个所有权 但是Rc和Arc一个重要的区别: Arc能够在多线程中安全的移动所有权换句话说让一个值的所有权可以移动到另一个线程中这是因为Arc本身实现了Send特征我们来看一下Send特征的定义 实现Send的类型可以在线程间安全的传递其所有权 unsafe implT: ?Sized Sync Send Send for ArcT {} unsafe implT: ?Sized Sync Send Sync for ArcT {}第一部分代码中可以看到我们需要实现线程的交叉打印那必然线程之间是要共享一个锁那么为了锁能够共享那么我们需要对锁产生多个所有权并且能够在线程之间移动所有权所以第一份的代码中是这样 let mutex Arc::new(Mutex::new(false));//初始值为false复制所有权和移动锁所有权的代码 let cmutex Arc::clone(mutex);//复制所有权let ccondavar Arc::clone(condvar);let handle thread::spawn(move || {//move移动所有权let mut lock cmutex.lock().unwrap();因此多个线程通过Arc持有了同一个Mutex的所有权并且是每个线程都有一个所有权可以共享使用Mutex 那么能够安全的传递Mutex的所有权能不能安全使用一个锁是另一个特征Sync实现的我们虽然安全的在多线程间移动所有权但是能不能安全使用还是需要实现Sync特征所以Mutex本身实现了Sync特征。也看一下Sync特征的定义。 实现Sync的类型可以在线程间安全的共享(通过引用) unsafe implT: ?Sized Send Sync for MutexT {}然后又可以看到Mutex中仅仅限制了其指向的值T只需要实现Send特征这是因为锁的值我们其实是想让线程每次单独的访问所以在一个时刻只有一个线程访问即可所有T只需要Send让一个时刻只有一个线程通过锁拿到值的一个所有权。 欢迎大家关注我的博客
http://www.dnsts.com.cn/news/82277.html

相关文章:

  • 吉林市网站建设招标mysql网站后台管理系统下载
  • 宁波网站推广专业服务长春网站快照优化公司
  • jsp建设网站教程吴江市建设局网站
  • 济南网站建设公司哪家好一点中国建设银行移动门户
  • 网站制作需要什么软件做直播网站找哪家网站
  • 网站开发中网页之间的链接形式apache建wordpress
  • 网站开发外包报价单网站搭建教程零基础
  • 深圳住房城乡建设局网站首页陕西省建设网官网首页
  • 阳城网站建设微信公众号开发创新
  • 网站 线框图网站兼容浏览器
  • 青岛外贸网站推广怎么自己刷推广链接
  • 网站后台清空三丰云免费服务器
  • 吴江企业网站制作虹口区建设工程管理网站
  • 做的比较好的医院网站西部数据网站助手
  • 西安做行业平台网站的公司本地合肥网站建设
  • 瓯北网站制作抖音官网链接网站怎么做
  • 天河建设网站公司长沙交互网站设计服务商
  • 定制设计网站公司制作网页代码大全
  • 全国设计网站建设品牌营销品牌推广
  • 100m网站空间服务费网站如何在百度上做推广方案
  • 梅州网站建设wlwl旅游网站功能流程图
  • 站长工具免费目前玩的人最多网游排行
  • 大兴网站建设价格十大视频剪辑软件排行榜
  • 百度搜到自己的网站企业网站导航栏高度
  • 做网站用微软雅黑百度推广 手机网站
  • 徐州住房和城乡建设部网站wordpress 主题设计
  • 求职网站开发多少钱qq企业邮箱格式
  • 怎样黑网站wordpress改织梦
  • 苏州公司名称查询信息流优化师简历模板
  • 广州铁路投资建设集团网站五莲做网站