1. Vấn đề nó giải quyết
std::thread bắt đầu thực thi đồng thời; object thread phải được join hoặc detach trước khi hủy; join còn đồng bộ việc hoàn tất. Nó làm ràng buộc quan trọng hiện rõ thay vì bắt người đọc đoán. Bài chỉ giữ phần cốt lõi C++11 vừa đủ cho một ngày tập trung.
2. Kiến thức cần có
Kiến thức Ngày 44, cùng biến, hàm và cách đọc output đã học trước đó.
3. Ý tưởng cốt lõi
Mental model: std::thread bắt đầu thực thi đồng thời; object thread phải được join hoặc detach trước khi hủy; join còn đồng bộ việc hoàn tất. Hãy xác định giá trị hoặc trạng thái liên quan, ai sở hữu nó và quy tắc tác động lúc compile hay lúc chạy.
4. Cú pháp tối thiểu
std::thread worker(task); worker.join();5. Cách nó hoạt động
Ví dụ tạo dữ liệu nhỏ, cố định và không cần nhập bàn phím.
C++11 hoặc contract thư viện chuẩn áp dụng quy tắc hôm nay.
Chương trình in kết quả quan trọng để đối chiếu với mã nguồn.
6. Lỗi thường gặp
Hủy
std::threadcòn joinable sẽ gọistd::terminate; detach thiếu cẩn thận còn có thể làm công việc sống lâu hơn dữ liệu tham chiếu.
7. Khi nào nên dùng
Nên dùng khi công việc độc lập nên chạy đồng thời và lifetime có thể đồng bộ.
Tránh dùng khi nó che ownership, lifetime, kiểu, thứ tự hoặc chi phí.
8. Ví dụ đơn giản
Worker tính kết quả cố định qua reference; join bảo đảm phép ghi hoàn tất trước khi main in giá trị. File .cpp dùng dữ liệu cố định và không thêm abstraction ngoài chủ đề.
Mã mẫu hoàn chỉnh
Tệp mã nguồn
cpp11/45_std_thread_lifetime/main.cpp
#include <iostream>
#include <thread>
void compute(int& result) {
result = 6 * 7;
}
int main() {
int result = 0;
std::thread worker(compute, std::ref(result));
std::cout << "joinable=" << worker.joinable() << '\n';
worker.join(); // wait and synchronize before reading result
std::cout << "result=" << result << '\n';
}
9. Điều cần nhớ
Tính năng nằm trong phạm vi C++11 của lộ trình này.
Hiểu hệ quả về lifetime, ownership, kiểu và thứ tự trước khi dùng.
Compile với cảnh báo và ưu tiên cách viết nhỏ nhất làm quy tắc hiện rõ.
10. Câu hỏi tự kiểm tra
Dễ — Sau khi tạo
std::thread worker(task), cần làm gì trước khi đối tượngworkerbị hủy nếu nó còn joinable?worker.join()bảo đảm điều gì ngoài việc chờ?Trung bình — Đọc ví dụ nhỏ ở trên. Chương trình sẽ in giá trị hoặc trạng thái nào, và quy tắc nào tạo ra kết quả đó?
Khó — Tìm và giải thích lỗi tinh tế trong tình huống sau: Hủy
std::threadcòn joinable sẽ gọistd::terminate; detach thiếu cẩn thận còn có thể làm công việc sống lâu hơn dữ liệu tham chiếu. Cách sửa nhỏ nhất nhưng an toàn trong C++11 là gì?