Skip to content
เข้าสู่ระบบ

Pinning

ยินดีต้อนรับสู่บอสลับของ Rust ครับ! Pinning สำคัญมากสำหรับการทำความเข้าใจว่า Async ทำงานยังไงเบื้องลึก

ลองนึกภาพว่าเรามีของอยู่บนโต๊ะ ปกติเราย้ายมันไปไหนก็ได้ แต่ถ้าเราตอกตะปูตรึงมันไว้ (Pin) มันก็จะอยู่ที่เดิมตลอด นี่คือสิ่งที่ Pin ทำกับข้อมูลใน Rust ครับ!

ปกติ Rust สามารถย้าย (Move) ข้อมูลใน Memory ได้อิสระ แต่จะมีข้อมูลบางประเภทที่ ห้ามย้ายเด็ดขาด เพราะอ้างอิงถึงตัวเอง

// ============================================
// Self-referential struct คือ struct ที่มี
// field หนึ่งชี้ไปหา field อื่นของตัวเอง
// ============================================
struct SelfRef {
value: String,
ptr: *const String, // ชี้ไปหา value ของตัวเอง!
}
// ============================================
// ปัญหา: Rust ย้ายข้อมูลใน memory ได้เสมอ
// ถ้า SelfRef ถูกย้าย ptr จะชี้ไปที่เก่า
// ซึ่งอาจกลายเป็น garbage แล้ว!
// ============================================
impl SelfRef {
fn new(value: String) -> Self {
let mut s = SelfRef {
value,
ptr: std::ptr::null(),
};
// ชี้ ptr ไปหา value
s.ptr = &s.value;
s
}
fn value(&self) -> &str {
// อันตราย! ถ้า self ถูก move แล้ว
// ptr จะชี้ไปที่ผิด!
unsafe { &*self.ptr }
}
}

เข้าสู่ระบบเพื่อดูเนื้อหาเต็ม

ยืนยันตัวตนด้วยบัญชี Google เพื่อปลดล็อกบทความทั้งหมด