Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <pthread.h>
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/sem.h>
- #include <semaphore.h>
- #define RAND_MAX 2;
- /*
- Lag et program som lager 4 ulike typer arbeidstråder. Disse trådene skal simulere produksjon og distrubisjon av en vilkårlig vare. Varen produseres
- av to ulike deler som må skaffes separat. Dette er oppgaven til de to første
- trådene som anskaffer hver sin vare og legge den til et delelager. Tiden det
- tar for innkjøp av de to delene er forskjellig og kan variere fra gang til gang.
- Den tredje tråden tar regelmessig en av hver av delene fra delelageret og produserer en ny enhet av varen som så blir plassert på lageret. Den siste tråden er ansvarlig for å skaffe kunder og distrubere den produserte varen.Dette er en mer uforutsigbar prosess så her må både tidsintervallet og antallet variere */
- int a = 0;
- int b = 0;
- int num = 0;
- //semaphore that can be accessed both in main and threadFunction
- sem_t mutexA;
- sem_t mutexB;
- sem_t mutexProd;
- void *threadA(void *arg)
- {
- printf("testA\n");
- int i;
- //critical section
- for(i = 0;i < 10;i++)
- {
- sleep(1);
- //Down semaphore
- sem_wait(&mutexA);
- a ++;
- //end critical section, up semaphore
- sem_post(&mutexA);
- printf("A: %i\n",a);
- }
- pthread_exit(0);
- }
- void *threadB(void *arg)
- {
- printf("testB\n");
- int i;
- //critical section
- for(i = 0;i < 10;i++)
- {
- sleep(2);
- //Down semaphore
- sem_wait(&mutexB);
- b ++;
- printf("B: %i\n",b);
- //end critical section, up semaphore
- sem_post(&mutexB);
- }
- pthread_exit(0);
- }
- void *threadProd(void *arg)
- {
- printf("testP\n");
- while(1)
- {
- if (a>0 && b>0)
- {
- sleep(1);
- sem_wait(&mutexA);
- a--;
- sem_post(&mutexA);
- sem_wait(&mutexB);
- b--;
- sem_post(&mutexB);
- sem_wait(&mutexProd);
- num ++;
- sem_post(&mutexProd);
- }
- }
- pthread_exit(0);
- }
- void *threadSell(void *arg)
- {
- int i;
- printf("testS\n");
- while(1)
- {
- sleep(3);
- if(num > 0)
- {
- sem_wait(&mutexProd);
- num--;
- sem_post(&mutexProd);
- printf("Selger 1 vare, varer på lager: %i\n",num);
- }
- }
- pthread_exit(0);
- }
- int main(void)
- {
- void *exitStatus;
- sem_init(&mutexA, 0,1);
- sem_init(&mutexB, 0,1);
- sem_init(&mutexProd, 0,1);
- pthread_t a_thread;
- pthread_t b_thread;
- pthread_t produce_thread;
- pthread_t sell_thread;
- pthread_create(&a_thread, NULL, threadA, NULL);
- pthread_create(&b_thread, NULL, threadB, NULL);
- pthread_create(&produce_thread, NULL, threadProd, NULL);
- pthread_create(&sell_thread, NULL, threadSell, NULL);
- pthread_join(a_thread, &exitStatus);
- pthread_join(b_thread, &exitStatus);
- pthread_join(produce_thread, &exitStatus);
- pthread_join(sell_thread,&exitStatus);
- sem_destroy(&mutexA);
- sem_destroy(&mutexB);
- sem_destroy(&mutexProd);
- return 0;
- }
Add Comment
Please, Sign In to add comment