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

营销网站建设苏州百度保障客服电话

营销网站建设苏州,百度保障客服电话,做动态网站怎么配置系统dsn,做竞价推广的网站要求文章目录 Rust对多线程的支持std::thread::spawn创建线程线程与 move 闭包 使用消息传递在线程间传送数据std::sync::mpsc::channel()for received in rx接收两个producer 共享状态并发std::sync::Mutex在多个线程间共享Mutex,使用std::sync::Arc 参考 Rust对多线程…

文章目录

  • Rust对多线程的支持
      • std::thread::spawn创建线程
      • 线程与 move 闭包
    • 使用消息传递在线程间传送数据
      • std::sync::mpsc::channel()
      • for received in rx接收
      • 两个producer
  • 共享状态并发
    • std::sync::Mutex
    • 在多个线程间共享Mutex,使用std::sync::Arc
  • 参考

Rust对多线程的支持

rust默认仅支持一对一线程,也就是说操作系统线程。

可以引入crate包来使用绿色线程。

std::thread::spawn创建线程

use std::thread;
use std::time::Duration;fn main() {let handle = thread::spawn(|| {for i in 1..10 {println!("hi number {} from the spawned thread!", i);thread::sleep(Duration::from_millis(1));}});for i in 1..5 {println!("hi number {} from the main thread!", i);thread::sleep(Duration::from_millis(1));}handle.join().unwrap();
}

编译

 cargo run
warning: unused `Result` that must be used--> src/main.rs:17:5|
17 |     handle.join();|     ^^^^^^^^^^^^^|= note: this `Result` may be an `Err` variant, which should be handled= note: `#[warn(unused_must_use)]` on by default
help: use `let _ = ...` to ignore the resulting value|
17 |     let _ = handle.join();|     +++++++warning: `smartPtr` (bin "smartPtr") generated 1 warningFinished `dev` profile [unoptimized + debuginfo] target(s) in 0.00sRunning `target/debug/smartPtr`
hi number 1 from the main thread!
hi number 1 from the spawned thread!
hi number 2 from the main thread!
hi number 2 from the spawned thread!
hi number 3 from the main thread!
hi number 3 from the spawned thread!
hi number 4 from the main thread!
hi number 4 from the spawned thread!
hi number 5 from the spawned thread!
hi number 6 from the spawned thread!
hi number 7 from the spawned thread!
hi number 8 from the spawned thread!
hi number 9 from the spawned thread!

线程与 move 闭包

use std::thread;fn main() {let v = vec![1, 2, 3];let handle = thread::spawn(move || {println!("Here's a vector: {:?}", v);});handle.join().unwrap();
}

编译

 cargo runBlocking waiting for file lock on build directoryCompiling smartPtr v0.1.0 (/home/wangji/installer/rust/bobo/smartPtr)Finished `dev` profile [unoptimized + debuginfo] target(s) in 19.07sRunning `target/debug/smartPtr`
Here's a vector: [1, 2, 3]

使用消息传递在线程间传送数据

std::sync::mpsc::channel()

只支持多个生产者和一个消费者

use std::sync::mpsc; //mpsc:multi-producer, single-consumer
use std::thread;fn main() {let (tx, rx) = mpsc::channel();thread::spawn(move || {let val = String::from("hi");tx.send(val).unwrap();});// recv()会阻塞// try_recv()是非阻塞,适合使用loop来尝试接收let received = rx.recv().unwrap();println!("Got: {}", received);
}

for received in rx接收

use std::sync::mpsc;
use std::thread;
use std::time::Duration;fn main() {let (tx, rx) = mpsc::channel();thread::spawn(move || {let vals = vec![String::from("hi"),String::from("from"),String::from("the"),String::from("thread"),];for val in vals {tx.send(val).unwrap();thread::sleep(Duration::from_secs(1));}});// 当发送方tx结束了,接收方rx就会结束(for循环也会结束)for received in rx {println!("Got: {}", received);}
}

两个producer

use std::sync::mpsc;
use std::thread;
use std::time::Duration;fn main() {// --snip--let (tx, rx) = mpsc::channel();let tx1 = tx.clone(); //tx和tx1都连接到mpsc::channel()thread::spawn(move || {let vals = vec![String::from("hi"),String::from("from"),String::from("the"),String::from("thread"),];for val in vals {tx1.send(val).unwrap();thread::sleep(Duration::from_secs(1));}});thread::spawn(move || {let vals = vec![String::from("more"),String::from("messages"),String::from("for"),String::from("you"),];for val in vals {tx.send(val).unwrap();thread::sleep(Duration::from_secs(1));}});for received in rx {println!("Got: {}", received);}// --snip--
}

共享状态并发

std::sync::Mutex

use std::sync::Mutex;fn main() {let m = Mutex::new(5);{// m.lock()会阻塞当前线程,获取锁位置let mut num = m.lock().unwrap();*num = 6;// 退出时会自动释放锁}println!("m = {:?}", m);
}

编译及运行

 cargo runCompiling smartPtr v0.1.0 (/home/wangji/installer/rust/bobo/smartPtr)Finished `dev` profile [unoptimized + debuginfo] target(s) in 6.57sRunning `target/debug/smartPtr`
m = Mutex { data: 6, poisoned: false, .. }

在多个线程间共享Mutex,使用std::sync::Arc

use std::sync::Arc;
use std::sync::Mutex;
use std::thread;fn main() {// Mutex于Arc经常一起使用// Rc::new可以让Mutex拥有多个所有者let counter = Arc::new(Mutex::new(0));let mut handles = vec![];for _ in 0..10 {let counter = Arc::clone(&counter); //Rc::clone不是真正的clone,只是增加引用计数let handle = thread::spawn(move || {let mut num = counter.lock().unwrap(); //counter.lock()可以获得可变的引用(类似于RefCell智能指针)*num += 1;});handles.push(handle);}for handle in handles {handle.join().unwrap();}println!("Result: {}", *counter.lock().unwrap());
}

编译

 cargo runCompiling smartPtr v0.1.0 (/home/wangji/installer/rust/bobo/smartPtr)Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.85sRunning `target/debug/smartPtr`
Result: 10

参考

  • 第16章~创建线程
http://www.jinmujx.cn/news/79970.html

相关文章:

  • 网站开发的数据临沂网站seo
  • 笑话网站域名培训机构管理系统
  • R shinny网站开发全网热搜关键词排行榜
  • 用空间做网站如何做好安全香港旺道旺国际集团
  • 做简单网站用什么软件网络营销五个特点
  • 搬家网站建设案例说明搜索引擎优化是什么
  • 就业网站建设总结seo排名课程咨询电话
  • 教人做辐射4mod的网站武汉软件测试培训机构排名
  • 菏泽网站建设公司网络营销的模式有哪些
  • 把手机做网站服务器世界杯球队最新排名
  • 建站易浏览器搜索引擎大全
  • 做网赌网站得多少钱企业营销策划包括哪些内容
  • 网站模板后台免费做网站
  • 网站怎么做营销策划英文seo实战派
  • 山西省政府网站建设的公司seo是什么东西
  • c net做的网站搜索引擎的四个组成部分及作用
  • 建网站主要工具免费网站制作软件平台
  • 电脑可以做网站服务器吗谷歌seo推广招聘
  • 做网站的一般多少钱晋江友情链接是什么意思
  • 电子商务网站建设规划企业网站优化公司
  • 常州医院网站建设关键词搜索优化
  • 网站需要条件广东最新新闻
  • 网站没备案能访问吗优化落实疫情防控
  • 长清治做网站seo关键词推广话术
  • 网站下做二级域名太原百度公司地址
  • 网站建设编程河南百度推广代理商
  • 动态网站开发流程seo网站优化培训找哪些
  • 安徽建网站公司企业培训
  • 北京学设计去哪个网站企业网站优化方案
  • 电子商务旅游网站建设论文it培训课程