线程

Rust 线程的运作方式与其他语言中的线程类似:

1. use std::thread;
2. use std::time::Duration;

4. fn main() {
5. thread::spawn(|| {
6. for i in 1..10 {
7. println!("Count in thread: {i}!");
8. thread::sleep(Duration::from_millis(5));
9. }
10. });

12. for i in 1..5 {
13. println!("Main thread: {i}");
14. thread::sleep(Duration::from_millis(5));
15. }
16. }
  • 线程均为守护程序线程,主线程不会等待这些线程。
  • 线程紧急警报 (panic) 是彼此独立的。

  • 紧急警报可以携带载荷,并可以使用 downcast_ref 对载荷进行解压缩。

  • Rust thread APIs look not too different from e.g. C++ ones.
  • Run the example.

  • 5ms timing is loose enough that main and spawned threads stay mostly in lockstep.

  • Notice that the program ends before the spawned thread reaches 10!
  • This is because main ends the program and spawned threads do not make it persist.
    • Compare to pthreads/C++ std::thread/boost::thread if desired.
  • How do we wait around for the spawned thread to complete?
  • thread::spawn returns a JoinHandle. Look at the docs.

  • JoinHandle has a .join() method that blocks.

  • Use let handle = thread::spawn(...) and later handle.join() to wait for the thread to finish and have the program count all the way to 10.
  • Now what if we want to return a value?
  • Look at docs again:

  • thread::spawn‘s closure returns T

  • JoinHandle .join() returns thread::Result<T>
  • Use the Result return value from handle.join() to get access to the returned value.
  • Ok, what about the other case?

  • Trigger a panic in the thread. Note that this doesn’t panic main.

  • Access the panic payload. This is a good time to talk about Any.
  • Now we can return values from threads! What about taking inputs?

  • Capture something by reference in the thread closure.

  • An error message indicates we must move it.
  • Move it in, see we can compute and then return a derived value.
  • If we want to borrow?

  • Main kills child threads when it returns, but another function would just return and leave them running.

  • That would be stack use-after-return, which violates memory safety!
  • How do we avoid this? see next slide.