Luồng ngầm (Implicit Threading)
Chuyển giao việc tạo/quản lý luồng từ lập trình viên sang trình biên dịch và thư viện runtime. Giúp giảm độ phức tạp và lỗi.
OpenMP (C/C++/Fortran)
Bộ chỉ thị trình biên dịch và API cho lập trình song song bộ nhớ chung.
Ví dụ:
#include <omp.h>
#include <stdio.h>
int main() {
#pragma omp parallel
{
printf("I am a parallel region.\n");
}
return 0;
}
Khi gặp #pragma omp parallel, OpenMP tạo số luồng = số lõi CPU. Mỗi luồng thực thi vùng song song rồi kết thúc.
Tính năng: song song hóa vòng lặp, kiểm soát số luồng, dữ liệu shared/private.
Grand Central Dispatch (GCD) - Apple
Kết hợp mở rộng ngôn ngữ C, API và thư viện runtime. Sử dụng block (đơn vị công việc tự chứa) và dispatch queue (hàng đợi).
- Serial queue: FIFO, thực thi tuần tự
- Concurrent queue: FIFO nhưng có thể lấy nhiều block cùng lúc → song song
Ví dụ:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{ printf("This is a block.\n"); });
Luồng như đối tượng (Threads as Objects)
Java Threads
Kế thừa class Thread hoặc implement interface Runnable. Override phương thức run(). Khởi động bằng start().
Python Threads
Hai cách: thread.start_new_thread(func) (cơ bản) hoặc kế thừa threading.Thread với phương thức run() (linh hoạt hơn, hỗ trợ join).
Đồng thời như thiết kế ngôn ngữ (Concurrency as Language Design)
Go - Goroutines & Channels
Từ khóa go trước lời gọi hàm tạo goroutine. Kênh (channel) truyền thông message-passing.
go keyboardListener(messages) success := <-messages // Blocking read
Rust - Ownership & Thread Safety
Sử dụng thread::spawn() với closure. Mô hình ownership ngăn chặn data race: luồng con nhận bản sao riêng của biến (move), không chia sẻ bộ nhớ.
let mut a = 7;
let child = thread::spawn(move || { a -= 1; println!("a = {}", a); });
a += 1;
child.join();
Hai luồng không thể can thiệp bộ nhớ nhau → an toàn bởi thiết kế.