Untitled

 avatar
unknown
plain_text
9 months ago
1.9 kB
5
Indexable
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>

#define BUFFER_SIZE 1  // גודל הבאפר
char buffer[BUFFER_SIZE];  // הבאפר המשותף
sem_t empty;  // סמפור לניהול תאים ריקים
sem_t full;   // סמפור לניהול תאים מלאים

void* producer(void* args) {
    for (char ch = 'A'; ch <= 'Z'; ch++) {
        sem_wait(&empty);  // חכה עד שיש מקום ריק בבאפר
        buffer[0] = ch;    // הכנס את האות לבאפר
        printf("Producer produced: %c\n", ch);
        sem_post(&full);   // הגדל את מונה התאים המלאים
        sleep(1);          // השהיה קצרה להמחשה
    }
    return NULL;
}

void* consumer(void* args) {
    for (int i = 0; i < 26; i++) {
        sem_wait(&full);   // חכה עד שיש תא מלא
        char ch = buffer[0];  // קרא את האות מהבאפר
        printf("Consumer consumed: %c\n", ch);
        sem_post(&empty);  // הגדל את מונה התאים הריקים
        sleep(1);          // השהיה קצרה להמחשה
    }
    return NULL;
}

int main() {
    pthread_t prodThread, consThread;  // חוטים ל-producer ול-consumer

    sem_init(&empty, 0, BUFFER_SIZE);  // אתחול סמפור התאים הריקים
    sem_init(&full, 0, 0);             // אתחול סמפור התאים המלאים

    pthread_create(&prodThread, NULL, producer, NULL);  // יצירת חוט ה-producer
    pthread_create(&consThread, NULL, consumer, NULL);  // יצירת חוט ה-consumer

    pthread_join(prodThread, NULL);  // המתן לסיום חוט ה-producer
    pthread_join(consThread, NULL);  // המתן לסיום חוט ה-consumer

    sem_destroy(&empty);  // השמדת סמפור התאים הריקים
    sem_destroy(&full);   // השמדת סמפור התאים המלאים

    return 0;
}
Editor is loading...
Leave a Comment