std::thread: การรวมและการแยกเธรด
สร้างเธรดด้วย std::thread และเลือกระหว่างการรอรวมเธรดกับการแยกเธรด
std::thread: การรวมและการแยกเธรด เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คลาส std::thread
ส่วนหัว <thread> เพิ่มการรองรับเธรดให้กับไลบรารีมาตรฐานใน C++11 อินสแตนซ์ std::thread แต่ละตัวแทนเธรดของ OS หนึ่งเธรด
การสร้างเธรด
ส่งสิ่งที่เรียกใช้งานได้ (ฟังก์ชัน แลมบ์ดา หรือฟังก์ชันอ็อบเจ็กต์) ให้กับตัวสร้าง เธรดจะเริ่มทำงานทันที
#include <thread>
#include <iostream>
void worker() { std::cout << "running on thread\n"; }
int main() {
std::thread t(worker);
t.join(); // wait for it to finish
}การส่งอาร์กิวเมนต์
ส่งต่ออาร์กิวเมนต์ไปยังสิ่งที่เรียกใช้งานได้ผ่านตัวสร้าง
std::thread t([](int n) { std::cout << n; }, 42);
t.join();การส่งแบบการอ้างอิง
ใช้ std::ref เพื่อส่งอาร์กิวเมนต์แบบการอ้างอิง หากไม่ใช้ เธรดจะได้รับสำเนาของอาร์กิวเมนต์
int counter = 0;
std::thread t([](int& c) { ++c; }, std::ref(counter));
t.join();
std::cout << counter; // 1join(): รอให้เสร็จสมบูรณ์
เรียก join() เพื่อบล็อกเธรดที่เรียกจนกว่าเธรดเป้าหมายจะทำงานเสร็จ หลังจาก join แล้ว เธรดนั้นจะไม่สามารถ join ได้อีก
detach(): ทำงานอย่างอิสระ
เรียก detach() เพื่อให้เธรดทำงานอย่างอิสระ เธรดจะยังทำงานต่อหลังจากอ็อบเจ็กต์ std::thread ถูกทำลาย OS จะคืนทรัพยากรเมื่อเธรดสิ้นสุดการทำงาน
std::thread t([]() { /* background work */ });
t.detach(); // we no longer track itjoinable()
ตรวจสอบว่าเธรดสามารถ join หรือ detach ได้หรือไม่ เธรดที่ถูก join หรือ detach แล้วจะไม่สามารถ join ได้อีก
ลืมเรียก join: การยุติการทำงาน
หาก std::thread ถูกทำลายขณะที่ยัง join ได้ โปรแกรมจะเรียก std::terminate ควรเรียก join หรือ detach ก่อนการทำลายเสมอ
ตัวห่อหุ้ม RAII
เขียนตัวห่อหุ้ม RAII ขนาดเล็กที่เรียก join ในตัวทำลาย หรือใช้ std::jthread (C++20) ซึ่งจะเรียก join ให้อัตโนมัติ
#include <thread>
// C++20
std::jthread t([] { /* work */ });
// t joins automatically when destroyedการทำงานพร้อมกันตามฮาร์ดแวร์
สอบถามจำนวนเธรดฮาร์ดแวร์ด้วย std::thread::hardware_concurrency() แล้วใช้ค่านี้กำหนดขนาดกลุ่มเธรด
ID ของเธรด
เธรดแต่ละตัวมี ID ที่ไม่ซ้ำกัน รับ ID ของเธรดปัจจุบันด้วย std::this_thread::get_id()
การให้เธรดหยุดพัก
ใช้ std::this_thread::sleep_for(duration) เพื่อหยุดพักเธรดปัจจุบัน
#include <chrono>
using namespace std::chrono_literals;
std::this_thread::sleep_for(500ms);ตรวจสอบอย่างรวดเร็ว
จะเกิดอะไรขึ้นหาก std::thread ที่ยัง join ได้ถูกทำลายก่อนเรียก join() หรือ detach()
สรุปทบทวน
สร้างเธรดด้วย std::thread และสิ่งที่เรียกใช้งานได้ ควรเรียก join() หรือ detach() ก่อนทำลายอ็อบเจ็กต์เธรดเสมอ หรือใช้ std::jthread (C++20) ซึ่งจะเรียก join ให้อัตโนมัติ
คำถามที่พบบ่อย
บทเรียน “std::thread: การรวมและการแยกเธรด” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “std::thread: การรวมและการแยกเธรด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “std::thread: การรวมและการแยกเธรด”
สร้างเธรดด้วย std::thread และเลือกระหว่างการรอรวมเธรดกับการแยกเธรด คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “std::thread: การรวมและการแยกเธรด” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม
ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- std::thread: การรวมและการแยกเธรด
- std::mutex, lock_guard และ unique_lock
- ตัวแปรเงื่อนไขและรูปแบบผู้ปฏิบัติงาน
- พื้นฐาน std::async และ std::future