rust:线程

1线程

类似于c++,创建线程可以直接传入已经定义的函数,也可以传入闭包,rust中的闭包和c++中的lambda表达式类似。c++中的lambda表达是可以捕获数据,引用捕获和值捕获都可以;rust中的闭包,需要通过move。

本例子中,handle2如果只用到msg的话,不需要move捕获,为什么?

rust 复制代码
use std::thread;
use std::time::Duration;

fn hello_thread() {
  println!("hello thread");
}

fn print_message(msg: String) {
  println!("msg: {}", msg);
}

fn main() {
  let handle1 = thread::spawn(hello_thread);

  let handle2 = thread::spawn(|| {
      for i in 1..10 {
        println!("hi number {} from this spawned thread2!", i);
        thread::sleep(Duration::from_millis(1));
      }
    }
  );

  let msg = String::from("hello rust thread");
  let v = vec![1, 2, 3];
  let handle3 = thread::spawn(move || {
      print_message(msg);
      println!("Here's a vector: {:?}", v);
    }
  );

  for i in 1..5 {
    println!("hi number {} from the main thread!", i);
    thread::sleep(Duration::from_millis(1));
  }

  handle1.join().unwrap();
  handle2.join().unwrap();
  handle3.join().unwrap();
}

2通道channel

类似于go语言,go语言中也有channel。

rust 复制代码
use std::thread;
use std::sync::mpsc;
use std::time::Duration;

fn main() {
  let (tx, rx) = mpsc::channel();
  let tx1 = mpsc::Sender::clone(&tx);

  let handle1 = thread::spawn(move || {
    let vals = vec![String::from("hello"), String::from("thread1")];
    for val in vals {
      tx.send(val).unwrap();
      thread::sleep(Duration::from_secs(1));
    }
  });

  let handle2 = thread::spawn(move || {
    let vals = vec![String::from("hello"), String::from("thread2")];
    for val in vals {
      tx1.send(val).unwrap();
      thread::sleep(Duration::from_secs(1));
    }
  });

  for recv in rx {
    println!("recv {}", recv);
  }

  handle1.join().unwrap();
  handle2.join().unwrap();
}

3多线程加锁

c++中的锁和数据时分离的,而rust中的锁和数据时集成到一块的。

rust 复制代码
use std::sync::{Mutex, Arc};
use std::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());
}
相关推荐
小徐不徐说19 小时前
序列化与反序列化:把 C++ 对象可靠地保存下来
开发语言·数据库·c++·php
ragnwang19 小时前
Notes: Python pybind11 import C++ module
开发语言·c++·python
Wang's Blog19 小时前
Java 项目实战: 交友项目 - 搜索附近的功能概述和分析
java·开发语言·交友
骑着蜗牛撵大象32719 小时前
大模型 Agent 的沙箱护栏:gVisor 隔离、出口白名单与审计闭环
java·开发语言·jvm·安全·agent沙箱·gvisor·microvm
Dxy123931021620 小时前
JS DES 加密详解
开发语言·javascript·arcgis
充值内卷20 小时前
我给桌面加了个鱼缸:C++ 写后端,WebView2 里养一座 Three.js 小岛
开发语言·javascript·c++
云和数据.ChenGuang21 小时前
深入解析 Python 的 dir():从用法到 CPython 源码实现
开发语言·人工智能·python·langchain
nice_lcj52021 小时前
深入理解 Java 反射:从 Class 对象到方法调用(含性能实测 + 迷你 IOC 实战 + 面试考点)
java·开发语言·后端·面试
樱花树下的数学喵1 天前
手写简易 STL string|C++ 字符串底层实现
开发语言·c++
遇码1 天前
2026-11-01-daw-retry-banner-body
人工智能·ai·rust·数据分析·大模型·agent