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