Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ทำความรู้จัก Smart Pointer

📅 วันที่เผยแพร่: 2026-03-05

การจัดการหน่วยความจำในภาษา Rust เปรียบเสมือนการเดินทางที่เริ่มจากรากฐานที่เรียบง่ายที่สุด นั่นคือการทำความเข้าใจ Stack และ Heap โดยเครื่องมือชิ้นแรกที่เราต้องรู้จักคือ Box<T> ซึ่งทำหน้าที่เป็นสมาร์ทพอยน์เตอร์ (Smart Pointer) พื้นฐานในการจองพื้นที่บน Heap สถาปัตยกรรมนี้มอบสิทธิการครอบครองข้อมูลแบบเจ้าของคนเดียว (Single Ownership) โดยไม่มีภาระการประมวลผลส่วนเกิน (Overhead) ตอนรันไทม์ ทำให้เหมาะอย่างยิ่งสำหรับข้อมูลที่มีขนาดไม่แน่นอนตอนคอมไพล์ หรือการสร้างโครงสร้างข้อมูลแบบ Recursive types อย่างไรก็ตาม เมื่อโปรแกรมมีความซับซ้อนขึ้นและต้องการให้ข้อมูลชุดเดียวมี “เจ้าของหลายคน” ลำพังเพียงแค่ Box จึงไม่สามารถตอบโจทย์ได้อีกต่อไป

กลไกการครอบครองร่วม: Rc และ Arc

เพื่อทลายข้อจำกัดดังกล่าว Rust จึงมีกลไกการครอบครองร่วม (Shared Ownership) ผ่านการนับจำนวนตัวอ้างอิง หากทำงานในสภาพแวดล้อมแบบเธรดเดียว เราสามารถใช้ Rc<T> ได้ แต่เมื่อก้าวเข้าสู่โลกของการทำงานพร้อมกันหลายเธรด (Concurrency) เราจำเป็นต้องพึ่งพา Arc<T> (Atomic Reference Counting) เพื่อรับประกันความปลอดภัยข้ามเธรด กลไกของ Arc จะคอยนับจำนวนเจ้าของและทำลายข้อมูลทิ้งอัตโนมัติเมื่อไม่มีใครใช้งาน ทว่ากฎเหล็กของการแชร์ข้อมูลใน Rust คือข้อมูลนั้นจะถูกบังคับให้อ่านได้อย่างเดียว ดังนั้น หากเราต้องการเข้าไปเปลี่ยนแปลงหรือแก้ไขข้อมูลที่ถูกแชร์อยู่ เราจึงต้องอาศัยเทคนิคการแก้ไขข้อมูลจากภายใน (Interior Mutability) เข้ามาประกอบด้วย

การแก้ไขข้อมูลข้ามเธรด: Mutex และ RwLock

การแก้ไขข้อมูลที่แชร์ข้ามเธรดอย่างปลอดภัยมักใช้สถาปัตยกรรมคู่หู นั่นคือการนำ Arc มาครอบ Mutex (Arc<Mutex<T>>) โดย Arc จะคอยจัดการเรื่องวงจรชีวิตของข้อมูล ส่วน Mutex จะทำหน้าที่เป็นประตูกลที่ยอมให้ทีละเธรดเข้าไปแก้ไขข้อมูลได้เท่านั้น เพื่อป้องกันปัญหาข้อมูลชนกัน แต่หากระบบงานของเราเน้นการอ่านเป็นหลัก (Read-heavy) การใช้ RwLock จะช่วยรีดประสิทธิภาพได้ดีกว่า เพราะอนุญาตให้หลายเธรดอ่านข้อมูลพร้อมกันได้อิสระ และจะทำการล็อกแบบผูกขาดก็ต่อเมื่อมีการเขียนเท่านั้น

กลไกความปลอดภัยและ Poisoned Lock

นอกจากนี้ Rust ยังมีกลไกความปลอดภัยขั้นสูง หากเธรดเกิดพังทลาย (Panic) ขณะกำลังถือล็อก ระบบจะทำการแจ้งเตือนว่าล็อกนั้น “ติดพิษ” (Poisoned) เพื่อยับยั้งไม่ให้เธรดอื่นนำข้อมูลที่อาจไม่สมบูรณ์ไปประมวลผลต่อ

ล็อกระดับฮาร์ดแวร์และเทคนิคขั้นสูง

เมื่อความเร็วในการทำงานคือเป้าหมายสูงสุด การใช้ล็อกที่พึ่งพาระบบปฏิบัติการอาจทำให้เกิดคอขวด Rust จึงเปิดประตูสู่การทำงานระดับฮาร์ดแวร์ด้วย Atomics ซึ่งใช้คำสั่งโดยตรงของ CPU ช่วยให้ปรับแก้ค่าตัวเลขได้รวดเร็วแบบไม่ต้องมีการล็อก (Lock-free) นอกจากนี้ยังมีเทคนิคทางเลือกเพื่อรีดประสิทธิภาพ เช่น การใช้ Scoped Threads ที่อนุญาตให้เธรดลูกดึงข้อมูลจาก Stack ของเธรดแม่ไปใช้ได้โดยตรงเพื่อลด Overhead ของ Arc ไปจนถึงการใช้โครงสร้างข้อมูลขั้นสูงอย่าง DashMap หรือ Crossbeam สำหรับระบบสเกลขนาดใหญ่

ท้ายที่สุดแล้ว หัวใจสำคัญของการประยุกต์ใช้สมาร์ทพอยน์เตอร์ใน Rust คือการไต่ระดับอย่างชาญฉลาด โดยเริ่มจากเครื่องมือที่เรียบง่ายและปลอดภัยที่สุด แล้วจึงค่อยๆ ปรับไปใช้สถาปัตยกรรมที่ซับซ้อนขึ้นเพื่อรักษาสมดุลระหว่างประสิทธิภาพและความถูกต้องของระบบอย่างสมบูรณ์แบบในที่สุด


Credit & Reference:

  1. A Guide to Rust Smart Pointers