Advertisement
Guest User

Untitled

a guest
Apr 28th, 2017
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.89 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <pthread.h>
  3. #include <semaphore.h>
  4. #ifndef __cplusplus
  5. typedef unsigned char bool;
  6. static const bool False = 0;
  7. static const bool True = 1;
  8. #endif
  9.  
  10. #define N 2 /* Reizes cik biezi katrs no filozofiem megina est */
  11. #define P 5 /* Filozofu skaits*/
  12.  
  13. sem_t Galds; /* Izmantojam semaforu ka galdu */
  14. sem_t Daksina[P]; /*Izmantojam semaforu ka daksinu */
  15. bool Switch ;
  16.  
  17. void *tphilosopher(void *ptr) { /* Funkcija atspogulo, kada bridi filozofs megina izpildit kadu noteiktu darbibu*/
  18.     int i, k = *((int *) ptr);
  19.     for(i = 1; i <= N; i++) {
  20.         printf("%*cFilozofs Doma %d %d\n", k*4, ' ', k, i); /* Pazinojuma izvade, ka filozofs sobrid doma */
  21.         if(Switch) {
  22.             sem_wait(&Galds) ; /*Semafora maina */
  23.         }
  24.         sem_wait(&Daksina[k]) ;
  25.         sem_wait(&Daksina[(k+1) % P]) ;
  26.         printf("%*cFilozofs Megina Est %d %d\n", k*4, ' ', k, i); /* Pazinojuma izvade, ka filozofs megina est*/
  27.         sem_post(&Daksina[k]) ;
  28.         sem_post(&Daksina[(k+1) % P]) ;
  29.         if(Switch) {
  30.             sem_post(&Galds) ;
  31.         }
  32.     }
  33.     pthread_exit(0);
  34. }
  35.  
  36. int main(int argc, char * argv[]) { /* Funkcija regule, kad daksinas ir brivas, lai neveidotos strupcels*/
  37.     int i, targ[P];
  38.     pthread_t thread[P];
  39.     sem_init(&Galds, 0, P-1);    
  40.     Switch = (argc > 1); /* Galda semafors ieslegts/izslegts */
  41.     printf("Switch=%s\n",(Switch?"true":"false"));
  42.     for(i=0;i<P;i++) {
  43.         sem_init(&Daksina[i], 0, 1);    
  44.     }
  45.     for(i=0;i<P;i++) {
  46.         targ[i] = i;
  47.         pthread_create(&thread[i], NULL, &tphilosopher,(void *) &targ[i]); /* Semafora izveide, vertiba palielinas par 1 */
  48.     }
  49.     for(i=0;i<P;i++) {
  50.         pthread_join(thread[i], NULL);
  51.     }
  52.     for(i=0;i<P;i++) {
  53.         sem_destroy(&Daksina[i]); /*Semafors tiek iznicinats, vertiba samazinas par 1 */
  54.     }
  55.     sem_destroy(&Galds);
  56.     return 0;
  57. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement