Ưu điểm của Luồng
Luồng tiết kiệm tài nguyên hơn so với đa tiến trình, cho phép chia sẻ biến và tài nguyên tiến trình.
Khái niệm Luồng
Luồng là tiến trình nhẹ, thường đại diện cho nhiều tác vụ trong một tiến trình. Tiến trình là đơn vị phân phối tài nguyên nhỏ nhất, trong khi luồng là đơn vị thực thi nhỏ nhất.
Đặc điểm Luồng
- Chia sẻ tài nguyên giữa các luồng
- Hiệu suất tạo luồng cao hơn 30%, chuyển đổi nhanh
- Sử dụng thư viện pthread (POSIX thread)
Hạn chế
- Độ ổn định thấp hơn so với tiến trình
- Gỡ lỗi phức tạp hơn
Quan hệ Luồng-Tiến trình
- Luồng phụ thuộc vào tiến trình
- Một tiến trình có thể chứa nhiều luồng chia sẻ tài nguyên
- Tiến trình đơn luồng chỉ chứa một luồng
Khác biệt chính
| Tiêu chí | Tiến trình | Luồng |
|---|---|---|
| Tài nguyên | Không chia sẻ | Chia sẻ tài nguyên |
| Không gian | Độc lập | Chung không gian |
Khung thiết kế POSIX
Quy trình: Tạo luồng → Thao tác → Thu hồi tài nguyên
#include <pthread.h>
#include <stdio.h>
void *xu_ly_video(void *ctx) {
while(1) {
printf("Xuất video\n");
sleep(1);
}
return NULL;
}
int main() {
pthread_t video_thread;
pthread_create(&video_thread, NULL, xu_ly_video, NULL);
while(1); // Giữ tiến trình chính
return 0;
}
Nhận diện Luồng
pthread_t id = pthread_self();
printf("ID luồng: %ld\n", id);
Kết thúc Luồng
Tự kết thúc
void *luong_phu(void *ctx) {
pthread_exit(NULL);
}
Buộc kết thúc
pthread_cancel(luong_id);
Thu hồi Tài nguyên
void *ket_qua;
pthread_join(luong_id, &ket_qua);
Thuộc tính tách biệt
pthread_detach(pthread_self());
Hàm dọn dẹp
void giai_phong(void *ctx) {
free(ctx);
}
void *luong(void *ctx) {
pthread_cleanup_push(giai_phong, ctx);
// Xử lý
pthread_cleanup_pop(1);
}
Chia sẻ Dữ liệu
int bien_chung = 0;
void *tang_bien(void *ctx) {
bien_chung += 10;
return NULL;
}
Truyền Tham số
Kiểu số nguyên
void *nhan_so(void *ctx) {
int *giatri = (int*)ctx;
*giatri *= 2;
return giatri;
}
Cấu trúc dữ liệu
typedef struct {
char ten[50];
int tuoi;
} NguoiDung;
void *xu_ly_nguoidung(void *ctx) {
NguoiDung *nd = (NguoiDung*)ctx;
printf("Tên: %s, Tuổi: %d\n", nd->ten, nd->tuoi);
return nd;
}
So sánh Tiến trình và Luồng
| Chức năng | Tiến trình | Luồng |
|---|---|---|
| Tạo | fork | pthread_create |
| Nhận diện | getpid | pthread_self |
| Kết thúc | exit | pthread_exit |
| Thu hồi | wait | pthread_join |