تردهای ساده
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 aJoinHandle
. به سند نگاه کنید.JoinHandle
دارد.join()
متد آن بلاکها.
-
از «let handle = thread::spawn(...)» و بعد از «handle.join()» استفاده کنید تا منتظر بمانید تا thread تمام شود و شمارنده برنامه برابر با مقدار ۱۰ باشد.
-
حالا اگر بخواهیم مقداری را برگردانیم چه؟
-
دوباره به اسناد نگاه کنید:
thread::spawn
's closure returnsT
JoinHandle
.join()
returnsthread::Result<T>
-
به کمک
Result
از «handle.join()» برای دسترسی به مقدار برگشتی استفاده کنید. -
خوب، مورد دیگر چطور؟
- فعالسازی یک panic در یک thread. توجه شود که این مورد panic
main
نیست. - دسترسی به این panic payload. بهترین زمان برای پرداخت به این موضوع است
Any
.
- فعالسازی یک panic در یک thread. توجه شود که این مورد panic
-
اکنون میتوانیم مقادیر را از رشتهها برگردانیم! در مورد گرفتن ورودیها چطور؟
- چیزی را از طریق reference در بستهبندی thread ثبت کنید.
- یک پیغام خطا نشان میدهد که باید آن را جابجا کنیم.
- آن را به داخل منتقل کنید، درنتیجه ما می توانیم محاسبه کنیم و سپس یک مقدار مشتق شده را برگردانیم.
-
اگر بخواهیم قرض (borrow) بگیریم چطور؟
- تابع Main در هنگام بازگشت threadهای فرزند را از بین میبرد، اما تابع دیگری return میشود و آنها را در حال اجرا میگذارد.
- این کار میتواند منجر به stack استفاده پس از return شود که memory safety را نقض میکند!
- چگونه از آن جلوگیری کنیم؟ صفحه بعدی را ببینید.