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

怎么自己制作一个网站扁平图标网站

怎么自己制作一个网站,扁平图标网站,2022年最火的新闻摘抄,最受欢迎的公众号排行榜导航 Rust多线程交叉打印Send Sync特征讲解 一、Rust多线程交叉打印二、Send Sync 特征讲解 Rust多线程交叉打印Send Sync特征讲解 一、Rust多线程交叉打印 先说背景有两个线程,分别为0号线程和1号线线程两个线程交叉打印共享值,并将共享值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号线程先抢到了Mutex,1号线程会先打印吗?
  • 答案是不会的,因为我们通过设置mutex的值为false,并在1号线程逻辑中的代码控制了,代码如下
if !*lock {//当mutex持有的值为true时才轮到1号线程打印,否则释放lock,然后等待lock = ccondavar.wait(lock).unwrap();}
  • 可以看到如果lock的初始值为false,信号量通过wait函数释放了这个锁,所以哪怕1号线程在最开始抢到了锁,也会在这里释放掉,让0号线程先打印

二、Send Sync 特征讲解

在Rust中,有一个很重要的机制就是所有权机制,值的赋值行为,很有可能导致一个值移动来移动去,使得在Rust的多线程编程中变得很难管理。

于此同时,多线程编程中,多个线程使用(拥有一个所有权)同一个变量的场景也是非常常见的,因为Rust提出了一个RcArc

RcArc一个共同特征:

  • 能够让一个值能有多个拥有者,即一个值,产生了多个所有权

但是RcArc一个重要的区别:

  • Arc能够在多线程中,安全的移动所有权,换句话说,让一个值的所有权可以移动到另一个线程中,这是因为Arc本身实现了Send特征,我们来看一下Send特征的定义

实现Send的类型可以在线程间安全的传递其所有权

unsafe impl<T: ?Sized + Sync + Send> Send for Arc<T> {}
unsafe impl<T: ?Sized + Sync + Send> Sync for Arc<T> {}

第一部分代码中,可以看到我们需要实现线程的交叉打印,那必然线程之间是要共享一个锁,那么为了锁能够共享,那么我们需要对锁产生多个所有权,并且能够在线程之间移动所有权,所以第一份的代码中是这样:

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 impl<T: ?Sized + Send> Sync for Mutex<T> {}

然后又可以看到,Mutex中,仅仅限制了其指向的值T只需要实现Send特征,这是因为锁的值,我们其实是想让线程每次单独的访问,所以在一个时刻只有一个线程访问即可,所有T需要Send,让一个时刻只有一个线程通过锁拿到值一个所有权

欢迎大家关注我的博客
在这里插入图片描述

http://www.yayakq.cn/news/527438/

相关文章:

  • ASP网站建设招聘科技栋梁之歌
  • 网站定位分析网站平台建设合同模版
  • 濮阳市网站建设合肥网站备案
  • 网站开发 定制 合同范本办公空间设计定位
  • 免费优化网站排名淘客怎么用网站做
  • 做简历的网站有做网站与做网页的区别
  • 网站有订单了有声音提醒怎么做聊城网站建设科技公司
  • 昆明网站策划基层网站建设作用
  • 厦门建设公司网站万载网站建设
  • 双语版网站怎么做博天网站建设网络
  • 南通网站快速收录郑州哪有做网站的
  • 郑州做网站好的公司wordpress akina
  • 郑州做网站的外包公司长沙人才招聘市场
  • 沾益县住房和城乡建设局网站软文推广案例
  • 调用别人网站注册表单必应搜索引擎入口官网
  • 网站及数据库怎么做后门修改wordpress的登陆地址
  • 做美工用的网站中国材料信息网
  • 个人网站要怎么做网站后台慢
  • 云主机怎么建网站网站开发与设计
  • 公司发布网站需要备案吗购物网站页面设计步骤
  • 档案信息网站建设建设网站需要了解什么
  • 画出网站和目录结构图南阳网站优化渠道
  • 做淘宝客网站需要多大空间html导航网站源码
  • 建设银行河北分行招聘网站开源的网站开发软件
  • 青岛哪里有做网站的注册网站需要什么程序
  • 免费推广网站入口2023燕做兼职的网站打字员
  • 教人做美食视频网站wordpress添加电台
  • 网站开发结课大作业重庆菜谱制作
  • html公司网站模板源码郑州人流医院排名
  • 传媒公司做网站编辑_如何?外网访问nas wordpress