พื้นฐาน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- std::thread: การรวมและการแยกเธรด
- std::mutex, lock_guard และ unique_lock
- ตัวแปรเงื่อนไขและรูปแบบผู้ปฏิบัติงาน
- พื้นฐาน std::async และ std::future