Luồng trong Hệ Thống Linux: Tạo, Quản Lý và Ứng Dụng

Ư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ìnhLuồng
Tài nguyênKhông chia sẻChia sẻ tài nguyên
Không gianĐộc lậpChung 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ăngTiến trìnhLuồng
Tạoforkpthread_create
Nhận diệngetpidpthread_self
Kết thúcexitpthread_exit
Thu hồiwaitpthread_join

Thẻ: pthread linux_threads multithreading c_programming process_management

Đăng vào ngày 6 tháng 6 lúc 02:42