Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<pthread.h>
- #include<semaphore.h>
- #include<stdlib.h>
- #include<time.h>
- #include <unistd.h>
- #define madhesia_bufferit 5
- struct buff_struct
- {
- int buffer[madhesia_bufferit];
- int slota_eLire;
- int slota_eZene;
- sem_t empty; //numeron sa slota jane te lira
- sem_t full; // numeron sa slota jane te zena;
- pthread_mutex_t mutex_lock; // siguron perjashtimin reciprok
- }Bufferi;
- void *Prodhuesi()
- {
- srand(time(NULL));
- while(1)
- {
- int item_iProdhuar = rand()%101;//gjeneron te dhenen(nje numer)
- /*nqs nuk ka slote te lire duhet te presim per kete
- sfhrytezojme semaforin empty */
- sem_wait(&Bufferi.empty);
- /* nqs bufferi eshte i zene nga ndonje proces tjeter presim
- duke thirrur semaforin binar mutex */
- pthread_mutex_lock(&Bufferi.mutex_lock);
- /* nqs dy hapat e mesiperm kalohen athere jemi te lire te fusim te dhena ne buffer */
- Bufferi.buffer[Bufferi.slota_eLire]=item_iProdhuar;
- //while(Bufferi.slota_eLire < madhesia_bufferit) Bufferi.slota_eLire++;
- Bufferi.slota_eLire = (Bufferi.slota_eLire+1)%madhesia_bufferit;
- /* Lirohet bufferi per perdorim nga konsumuesi */
- pthread_mutex_unlock(&Bufferi.mutex_lock);
- for(int j = 0; j < madhesia_bufferit; j++)
- {
- printf("| %d", Bufferi.buffer[j]);
- }
- printf("\n");
- sleep(2);
- /* Automatikisht rritet numri i variablit 'full' */
- sem_post(&Bufferi.full);
- }
- }
- void *Konsumuesi()
- {
- int counter=1;
- while(1)
- {
- int item_iLarguar;
- /* presim derisa prodhuesi te prodhoj ndonje item ,
- per kete sfhrytezojme semaforin full duke ia bere check if full > 0 */
- sem_wait(&Bufferi.full);
- /* nqs bufferi eshte i zene nga ndonje proces tjeter presim
- duke thirrur semaforin binar mutex */
- pthread_mutex_lock(&Bufferi.mutex_lock);
- /* nqs dy hapat e mesiperm kalohen athere jemi te lire te largojme te dhena ne buffer */
- item_iLarguar = Bufferi.buffer[Bufferi.slota_eZene];
- //while(Bufferi.slota_eZene < madhesia_bufferit) Bufferi.slota_eZene++;
- Bufferi.slota_eZene = (Bufferi.slota_eZene+1)%madhesia_bufferit;
- /* Lirohet bufferi per perdorim nga prodhuesi */
- pthread_mutex_unlock(&Bufferi.mutex_lock);
- for(int j = 0; j< madhesia_bufferit; j++)
- {
- Bufferi.buffer[(counter - 1) % 5] = 0;
- //printf("| %d haha", );
- }
- printf("\n\n\n");
- counter++;
- /* Automatikisht rritet numri i variablit 'empty' */
- sem_post(&Bufferi.empty);
- }
- }
- void main()
- {
- pthread_t t1,t2;//t1 si prodhues,t2 si konsumues dmth threda per qito dyja
- sem_init(&Bufferi.empty,0,madhesia_bufferit);//0 dmth po pajtohet mu bo shared
- sem_init(&Bufferi.full,0,0);
- pthread_mutex_init(&Bufferi.mutex_lock, NULL);
- Bufferi.slota_eLire=0;
- Bufferi.slota_eZene=0;
- pthread_create(&t1,NULL,Prodhuesi,NULL);//qiky thread po kriojet per prodhuesin
- pthread_create(&t2,NULL,Konsumuesi,NULL);//qiky thread po kriojet per prodhuesin
- pthread_join(t1,NULL);
- pthread_join(t2,NULL);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement