تردهای ساده

threadهای Rust مانند threadها در زبان‌های دیگر کار می‌کنند:

use std::thread;
use std::time::Duration;

fn main() {
    thread::spawn(|| {
        for i in 0..10 {
            println!("شمارنده thread: {i}!");
            thread::sleep(Duration::from_millis(5));
        }
    });

    for i in 0..5 {
        println!("Main thread: {i}");
        thread::sleep(Duration::from_millis(5));
    }
}
  • ایجاد threadهای جدید به طور خودکار خاتمه برنامه را تا پایان main به تاخیر نمی‌اندازد.
  • Thread panicها مستقل از یکدیگر هستند.
    • ‏Panicها می‌تواند payloadای را حمل کند که می‌توان آن را با «downcast_ref» باز کرد.
This slide should take about 15 minutes.
  • ‏Rust thread API ها خیلی متفاوت از موارد دیگر به نظر نمی‌رسند. که C++ یکی از آن‌ها است.

  • مثال را اجرا کنید.

    • زمان‌بندی 5 میلی‌ثانیه به اندازه‌ای سست هستند که thread اصلی و spawned threadها عمدتاً همگام می‌مانند.
    • توجه داشته باشید که برنامه قبل از اینکه thread spawned به مقدار ۱۰ برسد به پایان می‌رسد!
    • این به خاطر است که انتهای main برنامه است و spawned threadها ایجاد شده باعث تداوم آن نمی‌شوند.
      • در مقابسه با pthreads/C++ std::thread/boost::thread اگر مطلوب باشد.
  • چقدر باید صبر کنیم تا یک spawned thread تکمیل شود؟

  • thread::spawn returns a JoinHandle. به سند نگاه کنید.

    • JoinHandle دارد .join() متد آن بلاک‌ها.
  • از «let handle = thread::spawn(...)» و بعد از «handle.join()» استفاده کنید تا منتظر بمانید تا thread تمام شود و شمارنده برنامه برابر با مقدار ۱۰ باشد.

  • حالا اگر بخواهیم مقداری را برگردانیم چه؟

  • دوباره به اسناد نگاه کنید:

  • به کمکResult از «handle.join()» برای دسترسی به مقدار برگشتی استفاده کنید.

  • خوب، مورد دیگر چطور؟

    • فعال‌سازی یک panic در یک thread. توجه شود که این مورد panic main نیست.
    • دسترسی به این panic payload. بهترین زمان برای پرداخت به این موضوع است Any.
  • اکنون می‌توانیم مقادیر را از رشته‌ها برگردانیم! در مورد گرفتن ورودی‌ها چطور؟

    • چیزی را از طریق reference در بسته‌بندی thread ثبت کنید.
    • یک پیغام خطا نشان می‌دهد که باید آن را جابجا کنیم.
    • آن را به داخل منتقل کنید، درنتیجه ما می توانیم محاسبه کنیم و سپس یک مقدار مشتق شده را برگردانیم.
  • اگر بخواهیم قرض (borrow) بگیریم چطور؟

    • تابع ‏Main در هنگام بازگشت threadهای فرزند را از بین می‌برد، اما تابع دیگری return می‌شود و آنها را در حال اجرا می‌گذارد.
    • این کار می‌تواند منجر به stack استفاده پس از return شود که memory safety را نقض می‌کند!
    • چگونه از آن جلوگیری کنیم؟ صفحه بعدی را ببینید.