Rust - Đồng thời

Trong lập trình đồng thời, các phần khác nhau của chương trình thực thi độc lập. Mặt khác, trong lập trình song song, các phần khác nhau của chương trình thực thi cùng một lúc. Cả hai mô hình đều quan trọng như nhau vì ngày càng nhiều máy tính tận dụng nhiều bộ vi xử lý của chúng.

Chủ đề

Chúng ta có thể sử dụng các luồng để chạy mã đồng thời. Trong các hệ điều hành hiện tại, mã của chương trình đã thực thi được chạy trong một quá trình và hệ điều hành quản lý nhiều quá trình cùng một lúc. Trong chương trình của bạn, bạn cũng có thể có các phần độc lập chạy đồng thời. Các tính năng chạy các phần độc lập này được gọi là luồng.

Tạo một chủ đề

Các thread::spawnđược sử dụng để tạo một chủ đề mới. Hàm spawn nhận một tham số đóng làm tham số. Đóng định nghĩa mã sẽ được thực thi bởi luồng. Ví dụ sau in một số văn bản từ một chuỗi chính và văn bản khác từ một chuỗi mới.

//import the necessary modules
use std::thread;
use std::time::Duration;

fn main() {
   //create a new thread
   thread::spawn(|| {
      for i in 1..10 {
         println!("hi number {} from the spawned thread!", i);
         thread::sleep(Duration::from_millis(1));
      }
   });
   //code executed by the main thread
   for i in 1..5 {
      println!("hi number {} from the main thread!", i);
      thread::sleep(Duration::from_millis(1));
   }
}

Đầu ra

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 spawned thread!
hi number 4 from the main thread!

Luồng chính in các giá trị từ 1 đến 4.

NOTE- Luồng mới sẽ bị dừng khi luồng chính kết thúc. Đầu ra từ chương trình này có thể khác một chút mỗi lần.

Các thread::sleephàm buộc một luồng ngừng thực thi trong một thời gian ngắn, cho phép một luồng khác chạy. Các luồng có thể sẽ thay phiên nhau, nhưng điều đó không được đảm bảo - nó phụ thuộc vào cách hệ điều hành lập lịch cho các luồng. Trong lần chạy này, luồng chính được in đầu tiên, mặc dù câu lệnh in từ luồng được tạo xuất hiện đầu tiên trong mã. Hơn nữa, ngay cả khi luồng sinh sản được lập trình để in các giá trị cho đến 9, nó chỉ đến 5 trước khi luồng chính tắt.

Tham gia Xử lý

Một chuỗi được tạo có thể không có cơ hội chạy hoặc chạy hoàn toàn. Điều này là do luồng chính hoàn thành nhanh chóng. Hàm sinh ra <F, T> (f: F) -> JoinHandlelt; T> trả về một JoinHandle. Phương thức join () trên JoinHandle đợi chuỗi liên kết kết thúc.

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();
}

Đầu ra

hi number 1 from the main thread!
hi number 1 from the spawned thread!
hi number 2 from the spawned thread!
hi number 2 from the main thread!
hi number 3 from the spawned thread!
hi number 3 from the main 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!

Chủ đề chính và luồng sinh sản tiếp tục chuyển đổi.

NOTE - Luồng chính chờ luồng sinh sản hoàn thành vì lệnh gọi đến join() phương pháp.