Học C++ từ Cơ Bản đến Nâng Cao

Website tự học lập trình C++ miễn phí, thực chiến, dễ hiểu

C++ Multithreading & Process

1. Cơ bản về Thread

std::thread dùng để tạo và chạy luồng.

void task() { std::cout << "Hello from thread!\n"; }
std::thread t(task);
t.join(); // hoặc t.detach();
    
🔸 Nên gọi join() hoặc detach() để tránh terminate chương trình.

2. Đồng bộ hóa: Mutex và Condition Variable

std::mutex m;
int shared = 0;
void inc() {
  std::lock_guard lock(m);
  ++shared;
}
    
std::condition_variable cv;
bool ready = false;
void worker() {
  std::unique_lock lock(m);
  cv.wait(lock, [] { return ready; });
  // do work
}
    

3. Future, Promise, Async

std::promise gửi dữ liệu từ thread A sang B, dùng kèm std::future.

std::promise p;
std::future f = p.get_future();
std::thread([&p]{ p.set_value(42); }).detach();
int result = f.get();
    

std::async tạo thread và tự động quản lý future.

std::future f = std::async([]{ return 5 + 3; });
int result = f.get();
    

4. Khi nào nên dùng thread?

5. Lưu ý về hiệu năng và tài nguyên

6. Những vấn đề thường gặp với thread

📌 Cách xử lý và phòng tránh:
  • Dùng std::lock_guard hoặc std::unique_lock để đảm bảo mutex luôn được unlock an toàn.
  • Luôn gọi join() hoặc detach() với mỗi thread được tạo.
  • Sử dụng try-catch trong thread để bắt exception và xử lý.
  • Dùng std::atomic nếu chỉ cần thay đổi đơn giản mà không cần mutex.
  • Tránh lock nhiều mutex cùng lúc, hoặc lock theo thứ tự cố định.

7. Làm việc với Process

pid_t pid = fork();
if (pid == 0) {
  // process con
  execlp("ls", "ls", "-l", nullptr);
} else {
  wait(NULL);
}
    
🔹 Lưu ý: Mỗi process có vùng nhớ tách biệt, cần IPC để trao đổi dữ liệu. Dùng signal hoặc socket cho thông báo bất đồng bộ.

8. So sánh Thread và Process

Tiêu chíThreadProcess
Định nghĩaĐơn vị nhỏ nhất trong thực thiChương trình đang chạy
Không gian nhớChia sẻ bộ nhớ với thread khácKhông gian nhớ tách biệt
Tài nguyênChia sẻ file, heapTài nguyên riêng biệt
Tốc độ tạoNhanhChậm hơn
Giao tiếpDễ (qua biến dùng chung)Cần IPC (pipe, shm, socket...)
Tác động lỗiCó thể ảnh hưởng toàn bộ processChỉ ảnh hưởng process đó
Ví dụ dùngSong song hoá xử lý UI, logicChạy chương trình độc lập
Khi nào dùng thread?
  • Khi muốn song song hóa nội bộ ứng dụng.
  • Khi cần chia sẻ bộ nhớ, xử lý nhanh và nhẹ.
Khi nào dùng process?
  • Khi cần cách ly độc lập giữa các phần.
  • Khi xử lý các tác vụ lớn, cần độ ổn định cao hoặc crash-safe.

← Quay lại C++ Nâng Cao