Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

In số theo thứ tự dùng đồng bộ luồng (thread synchronization) trong C

Chương trình in số từ 1 đến 10 bằng cách đồng bộ hai luồng (thread) dựa trên độ ưu tiên.

Thread là gì?

Thread là tiến trình nhẹ chạy bên trong chương trình. C không hỗ trợ đa luồng chuẩn, dùng POSIX Threads (Pthreads) với thư viện pthread.h.

Cách hoạt động

Hai luồng: một in số chẵn, một in số lẻ. Sử dụng mutex và condition variable để đồng bộ, đảm bảo in lần lượt 1, 2, 3... 10.

Thuật toán

BẮT ĐẦU
BƯỚC 1: BIẾN TOÀN CỤC MAX=10, count=1
BƯỚC 2: pthread_mutex_t thr; pthread_cond_t cond
BƯỚC 3: HÀM even(void* arg)
    KHI count < MAX LẶP
        pthread_mutex_lock(&thr)
        KHI count % 2 != 0 LẶP: pthread_cond_wait(&cond, &thr)
        IN count++
        pthread_mutex_unlock(&thr)
        pthread_cond_signal(&cond)
    KẾT THÚC KHI
    pthread_exit(0)
BƯỚC 4: HÀM odd(void* arg) - TƯƠNG TỰ VỚI count % 2 != 1
BƯỚC 5: MAIN()
    TẠO thread1, thread2
    KHỞI TẠO mutex, cond
    TẠO LUỒNG even, odd
    JOIN CẢ HAI LUỒNG
    HỦY mutex, cond
KẾT THÚC

Chương trình C ví dụ

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

int MAX = 10;
int count = 1;
pthread_mutex_t thr;
pthread_cond_t cond;

void* even(void* arg) {
    while (count < MAX) {
        pthread_mutex_lock(&thr);
        while (count % 2 != 0)
            pthread_cond_wait(&cond, &thr);
        printf("%d ", count++);
        pthread_mutex_unlock(&thr);
        pthread_cond_signal(&cond);
    }
    pthread_exit(0);
}

void* odd(void* arg) {
    while (count < MAX) {
        pthread_mutex_lock(&thr);
        while (count % 2 != 1)
            pthread_cond_wait(&cond, &thr);
        printf("%d ", count++);
        pthread_mutex_unlock(&thr);
        pthread_cond_signal(&cond);
    }
    pthread_exit(0);
}

int main() {
    pthread_t thread1, thread2;
    pthread_mutex_init(&thr, 0);
    pthread_cond_init(&cond, 0);
    pthread_create(&thread1, 0, &even, NULL);
    pthread_create(&thread2, 0, &odd, NULL);
    pthread_join(thread1, 0);
    pthread_join(thread2, 0);
    pthread_mutex_destroy(&thr);
    pthread_cond_destroy(&cond);
    return 0;
}

Kết quả

1 2 3 4 5 6 7 8 9 10