Pinning
ยินดีต้อนรับสู่บอสลับของ Rust ครับ! Pinning สำคัญมากสำหรับการทำความเข้าใจว่า Async ทำงานยังไงเบื้องลึก
ลองนึกภาพว่าเรามีของอยู่บนโต๊ะ ปกติเราย้ายมันไปไหนก็ได้ แต่ถ้าเราตอกตะปูตรึงมันไว้ (Pin) มันก็จะอยู่ที่เดิมตลอด นี่คือสิ่งที่ Pin ทำกับข้อมูลใน Rust ครับ!
1. ทำไมต้อง Pin?
Section titled “1. ทำไมต้อง Pin?”1.1 Self-Referential Structs
Section titled “1.1 Self-Referential Structs”ปกติ 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 เพื่อปลดล็อกบทความทั้งหมด
Login with Google