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

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;   // 1

join(): รอให้เสร็จสมบูรณ์

เรียก join() เพื่อบล็อกเธรดที่เรียกจนกว่าเธรดเป้าหมายจะทำงานเสร็จ หลังจาก join แล้ว เธรดนั้นจะไม่สามารถ join ได้อีก

detach(): ทำงานอย่างอิสระ

เรียก detach() เพื่อให้เธรดทำงานอย่างอิสระ เธรดจะยังทำงานต่อหลังจากอ็อบเจ็กต์ std::thread ถูกทำลาย OS จะคืนทรัพยากรเมื่อเธรดสิ้นสุดการทำงาน

std::thread t([]() { /* background work */ });
t.detach();   // we no longer track it

joinable()

ตรวจสอบว่าเธรดสามารถ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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