Advertisement
Guest User

Untitled

a guest
Mar 27th, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.96 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "lib.h"
  4. #include <semaphore.h>
  5. #include <unistd.h>
  6. #include <time.h>
  7. #include <sys/wait.h>
  8.  
  9. typedef struct {
  10.         int cnt;
  11.         int cnt2;
  12.         sem_t sem;
  13.         sem_t mutex;
  14.         sem_t sem2;
  15. }shared_str;
  16.  
  17. //global shared mem
  18. shared_str *st;
  19.  
  20.  
  21. void wall(int i, int n){
  22.         for(int j = 0; j < 5; j++)
  23.         {
  24.         sem_wait(&st->mutex);
  25.         st->cnt++;
  26.  
  27.         if(st->cnt == n){
  28.                 printf("prisiel posledny proces \n");
  29.                 sem_wait(&st->sem2);
  30.                 sem_post(&st->sem);
  31.         }
  32.  
  33.         sem_post(&st->mutex);
  34.         printf("proces c.[%d] caka\n", i);
  35.         sem_wait(&st->sem);
  36.         printf("proces c.[%d] ide dalej \n", i);
  37.         sem_post(&st->sem);
  38.  
  39.         sem_wait(&st->mutex);
  40.         st->cnt--;
  41.         if(st->cnt == 0){
  42.                 printf("prisiel zasa posledny proces \n ");
  43.                 sem_post(&st->sem2);
  44.                 sem_wait(&st->sem);
  45.         }
  46.  
  47.         sem_post(&st->mutex);
  48.  
  49.         sem_wait(&st->sem2);
  50.         sem_post(&st->sem2);
  51.         }
  52.  
  53.  
  54. }
  55.  
  56. int main(){
  57.  
  58.         int n = 10;
  59.         st = (shared_str*) malloc_shared(sizeof(shared_str));
  60.         sem_init(&st->mutex     , 1, 1);
  61.         sem_init(&st->sem       , 1, 0);
  62.         sem_init(&st->sem2      , 1, 1);
  63.         st->cnt = 0;
  64.         st->cnt2 = 0;
  65.         for(int i = 0; i < n; i++){
  66.                 printf("%d\n", i);
  67.                 switch(fork()){
  68.                 case -1:
  69.                         perror("err fork\n");
  70.                         exit(-1);
  71.                         break;
  72.                 case 0:
  73.                         wall(i, n);
  74.                         return 0;
  75.                         break;
  76.                 default:
  77.                         break;
  78.                 }
  79.  
  80.         }
  81.  
  82.         for(int i = 0; i < n; i++){
  83.                 wait(NULL);
  84.         }
  85.  
  86.         free_shared(st);
  87.  
  88.         return 0;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement