לדלג לתוכן

פתרון גרפי בעלות והמתנה

פתרון ראשון

העובד הראשון מחכה לימנית שבידי השני, והשני מחכה לשמאלית שבידי הראשון. הראשי מחכה לסיום הראשון, ולכן הוא תלוי במעגל אבל אינו יוצר אותו. המתנה על נעילה יכולה להיות תקינה כאשר הבעלים מסוגל להתקדם, וההוכחה כאן נשענת על המעגל ועל העובדה ששני העובדים הגיעו למחסום עם הנעילה הראשונה.

פתרון שני

הקוד הבא הוא פתרון עצמאי שבו הקישור קדימה חזק והקישור חזרה חלש.

use std::cell::RefCell;
use std::rc::{Rc, Weak};
struct Node { next: RefCell<Option<Rc<Node>>>, previous: RefCell<Weak<Node>> }
fn main() {
    let first = Rc::new(Node { next: RefCell::new(None), previous: RefCell::new(Weak::new()) });
    let second = Rc::new(Node { next: RefCell::new(None), previous: RefCell::new(Weak::new()) });
    *first.next.borrow_mut() = Some(second.clone());
    *second.previous.borrow_mut() = Rc::downgrade(&first);
    let first_witness = Rc::downgrade(&first);
    let second_witness = Rc::downgrade(&second);
    drop(first);
    drop(second);
    assert!(first_witness.upgrade().is_none());
    assert!(second_witness.upgrade().is_none());
}

הקשר החלש אינו מגדיל את מונה הבעלות החזקה. כאשר אין עוד בעלים חיצוניים, שרשרת ההשמדה מסתיימת בלי מעגל שמחזיק את עצמו.

פתרון שלישי

נשתמש בזמן המתנה מוגבל כדי שהבדיקה עצמה לא תיתקע.

use std::sync::mpsc::{self, RecvTimeoutError};
use std::time::Duration;
fn main() {
    let (sender, receiver) = mpsc::channel::<u8>();
    let child_sender = sender.clone();
    std::thread::spawn(move || child_sender.send(7).unwrap()).join().unwrap();
    assert_eq!(receiver.recv().unwrap(), 7);
    assert!(matches!(receiver.recv_timeout(Duration::from_millis(20)),
        Err(RecvTimeoutError::Timeout)));
    drop(sender);
    assert!(matches!(receiver.recv_timeout(Duration::from_millis(20)),
        Err(RecvTimeoutError::Disconnected)));
}

נמדוד אובייקטים חיים, פריטים בתור, עבודות פעילות וזיכרון תושב בנפרד. ירידת מספר האובייקטים בלי ירידה מיידית בזיכרון מתאימה להשערה שהמקצה שומר אזורים. תור שאינו יורד יחד עם עובדים שממתינים לאירוע חסר מתאים להשערת חוסר התקדמות. אובייקטים שנשארים אחרי שכל העבודה הסתיימה מצדיקים חקירת גרף בעלות.