Guest User

Untitled

a guest
Jan 19th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.89 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <pthread.h>
  3. #include <stdio.h>
  4. #include <sys/types.h>
  5. #include <sys/sem.h>
  6. #include <semaphore.h>
  7. #define RAND_MAX 2;
  8. /*
  9. 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
  10. av to ulike deler som må skaffes separat. Dette er oppgaven til de to første
  11. trådene som anskaffer hver sin vare og legge den til et delelager. Tiden det
  12. tar for innkjøp av de to delene er forskjellig og kan variere fra gang til gang.
  13. 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 */
  14.  
  15.  
  16.  
  17. int a = 0;
  18. int b = 0;
  19. int num = 0;
  20.  
  21. //semaphore that can be accessed both in main and threadFunction
  22. sem_t mutexA;
  23. sem_t mutexB;
  24. sem_t mutexProd;
  25.  
  26. void *threadA(void *arg)
  27. {
  28.     printf("testA\n");
  29.     int i; 
  30.     //critical section
  31. for(i = 0;i <  10;i++)
  32.     {  
  33.         sleep(1);
  34.         //Down semaphore
  35.         sem_wait(&mutexA);
  36.         a ++;
  37.         //end critical section, up semaphore
  38.         sem_post(&mutexA);
  39.         printf("A: %i\n",a);
  40.     }
  41.    
  42.     pthread_exit(0);
  43. }
  44.  
  45. void *threadB(void *arg)
  46. {  
  47.     printf("testB\n");
  48.     int i;
  49.     //critical section
  50.     for(i = 0;i < 10;i++)
  51.     {          
  52.         sleep(2);
  53.         //Down semaphore
  54.         sem_wait(&mutexB);
  55.         b ++;
  56.         printf("B: %i\n",b);
  57.         //end critical section, up semaphore
  58.         sem_post(&mutexB);
  59.  
  60.     }
  61.        
  62.     pthread_exit(0);
  63. }
  64.  
  65. void *threadProd(void *arg)
  66. {
  67.     printf("testP\n");
  68.     while(1)
  69.         {
  70.               if (a>0 && b>0)
  71.           {
  72.  
  73.             sleep(1);
  74.             sem_wait(&mutexA);
  75.             a--;
  76.             sem_post(&mutexA);
  77.             sem_wait(&mutexB);
  78.             b--;
  79.             sem_post(&mutexB);
  80.             sem_wait(&mutexProd);
  81.             num ++;
  82.             sem_post(&mutexProd);
  83.            }
  84.         }
  85.                
  86.         pthread_exit(0);
  87. }
  88.  
  89. void *threadSell(void *arg)
  90. {
  91.     int i;
  92.  
  93.  
  94.         printf("testS\n");
  95.      
  96.         while(1)
  97.     {
  98.         sleep(3);
  99.         if(num > 0)
  100.          {
  101.             sem_wait(&mutexProd);
  102.             num--;
  103.             sem_post(&mutexProd);
  104.             printf("Selger 1 vare, varer på lager: %i\n",num);
  105.         }
  106.     }
  107.     pthread_exit(0);
  108. }
  109.  
  110.  
  111.     int main(void)
  112.     {
  113.         void *exitStatus;
  114.         sem_init(&mutexA, 0,1);
  115.         sem_init(&mutexB, 0,1);
  116.         sem_init(&mutexProd, 0,1);
  117.  
  118.  
  119.         pthread_t a_thread;
  120.         pthread_t b_thread;
  121.         pthread_t produce_thread;
  122.         pthread_t sell_thread;
  123.    
  124.         pthread_create(&a_thread, NULL, threadA, NULL);
  125.         pthread_create(&b_thread, NULL, threadB, NULL);
  126.         pthread_create(&produce_thread, NULL, threadProd, NULL);
  127.         pthread_create(&sell_thread, NULL, threadSell, NULL);
  128.    
  129.     pthread_join(a_thread, &exitStatus);
  130.     pthread_join(b_thread, &exitStatus);
  131.     pthread_join(produce_thread, &exitStatus);
  132.     pthread_join(sell_thread,&exitStatus);
  133.  
  134.     sem_destroy(&mutexA);
  135.     sem_destroy(&mutexB);
  136.     sem_destroy(&mutexProd);
  137.    
  138.     return 0;
  139.     }
Add Comment
Please, Sign In to add comment