0Pricing
C++ Academy · บทเรียน

พื้นฐาน std::async และ std::future

เรียกใช้งานแบบอะซิงโครนัส และรับผลลัพธ์ผ่าน std::future

พื้นฐาน std::async และ std::future เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

งานแบบอะซิงโครนัส

std::async เรียกใช้ฟังก์ชันแบบอะซิงโครนัสและคืนค่า std::future ซึ่งส่งมอบผลลัพธ์ให้ เป็นทางเลือกในระดับสูงกว่าการจัดการเธรดด้วยตนเอง

การใช้งานพื้นฐาน

ส่งออบเจ็กต์ที่เรียกใช้งานได้และอาร์กิวเมนต์เข้าไป std::async จะคืนค่า std::future<Result>

#include <future>

int compute() { return 42; }

std::future<int> f = std::async(compute);
int result = f.get();   // blocks until done

นโยบายการเริ่มงาน

อาร์กิวเมนต์แรกจะควบคุมเวลาที่งานทำงาน:

  • std::launch::async — เริ่มเธรดใหม่ทันที
  • std::launch::deferred — ทำงานแบบพร้อมกันเมื่อเรียก get()
  • ค่าเริ่มต้น (ไม่ระบุนโยบาย) — ให้การทำงานของระบบเป็นผู้เลือก
auto f = std::async(std::launch::async, compute);

เมธอดของ std::future

การดำเนินการที่ใช้กันทั่วไป:

  • get() — บล็อกจนกว่าจะเสร็จและคืนผลลัพธ์ (เรียกได้เพียงครั้งเดียว)
  • wait() — บล็อกแต่ไม่คืนผลลัพธ์
  • wait_for(d) / wait_until(t) — การรอแบบกำหนดเวลา
  • valid() — ฟิวเจอร์นี้ได้รับการเตรียมไว้แล้วหรือไม่

การส่งต่อข้อยกเว้น

หากงานแบบอะซิงโครนัสโยนข้อยกเว้น ข้อยกเว้นนั้นจะถูกเก็บไว้ในฟิวเจอร์และถูกโยนซ้ำเมื่อเรียก get()

auto f = std::async([] { throw std::runtime_error("oops"); });
try {
    f.get();
} catch (const std::exception& e) {
    std::cout << e.what();
}

การคืนค่าหลายค่า

ห่อผลลัพธ์ไว้ในทูเพิล โครงสร้าง หรือคอนเทนเนอร์

auto f = std::async([] {
    return std::make_pair(42, std::string("hello"));
});
auto [n, s] = f.get();

งานหลายงานแบบขนาน

เริ่มงานแบบอะซิงโครนัสหลายงาน แล้วรอให้งานทั้งหมดเสร็จสิ้น

auto a = std::async(work_a);
auto b = std::async(work_b);
auto c = std::async(work_c);

std::cout << a.get() + b.get() + c.get();

std::promise: ฟิวเจอร์แบบกำหนดเอง

สำหรับรูปแบบผู้ผลิตและ consumer ที่ consumer ต้องการฟิวเจอร์ แต่ผู้ผลิตอยู่ในอีกเธรดหนึ่ง ให้ใช้ std::promise

std::promise<int> p;
std::future<int> f = p.get_future();

std::thread t([&p] { p.set_value(42); });
std::cout << f.get();
t.join();

std::packaged_task

รวมออบเจ็กต์ที่เรียกใช้งานได้เข้ากับฟิวเจอร์ เหมาะสำหรับกรณีที่งานถูกเรียกใช้จากที่อื่น เช่น กลุ่มเธรด

shared_future

std::future สามารถอ่านได้เพียงครั้งเดียว ส่วน std::shared_future อนุญาตให้มีผู้อ่านหลายราย จึงเหมาะสำหรับการกระจายผลลัพธ์

พฤติกรรมของตัวทำลาย

ตัวทำลายของฟิวเจอร์ที่คืนค่าจาก std::async ด้วยนโยบายเริ่มต้นอาจบล็อกจนกว่างานจะเสร็จสิ้น โปรดระวังเรื่องนี้ในงานที่ทำงานเป็นเวลานาน

นอกเหนือจาก std::async

สำหรับงานแบบอะซิงโครนัสระดับใช้งานจริง ควรพิจารณาไลบรารีอย่าง Boost.Asio, Folly หรือ executors และโครูทีนของ C++20/23 โดย std::async เป็นจุดเริ่มต้น

ตรวจสอบความเข้าใจ

การเรียก .get() บนออบเจ็กต์ std::future ทำอะไร

สรุป

std::async เรียกใช้ฟังก์ชันแบบอะซิงโครนัส ส่วน std::future ที่คืนค่าจะส่งมอบผลลัพธ์และส่งต่อข้อยกเว้น ใช้นโยบายการเริ่มงานเพื่อควบคุมการทำงาน สำหรับรูปแบบที่ซับซ้อน ให้ใช้ std::promise และ std::packaged_task

คำถามที่พบบ่อย

บทเรียน “พื้นฐาน std::async และ std::future” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “พื้นฐาน std::async และ std::future” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “พื้นฐาน std::async และ std::future”

เรียกใช้งานแบบอะซิงโครนัส และรับผลลัพธ์ผ่าน std::future คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “พื้นฐาน std::async และ std::future” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม

ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. std::thread: การรวมและการแยกเธรด
  2. std::mutex, lock_guard และ unique_lock
  3. ตัวแปรเงื่อนไขและรูปแบบผู้ปฏิบัติงาน
  4. พื้นฐาน std::async และ std::future
← กลับไปที่ C++ Academy