Witam, mam problem a mianowicie, jak przerobić poniższy kod tak aby działał za pomocą 4 semaforów(nie mój wymysł) a nie bariery. Nie bardzo wiem w których miejscach dać wait'y i posty. Dodam ze program ma symulować spotkanie się 2 wątków w pętli nieskończonej. Czytałem już o tym na tej stronie:
https://greenteapress.com/semaphores/LittleBookOfSemaphores.pdf
Ale nadal nie bardzo wiem jak ruszyć.
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define liczba_watkow 10
int ident[2]={0,0},indeks=0,ile=0;
pthread_mutex_t zamek;
sem_t semafor,semafor2,semafor3,semafor4;
pthread_barrier_t barrier;
void* p (void* k) { // funkcja watku (watek)
int nr=(long)k,nr2;
int ja,on,i,l;
while(1) {
printf("---->\n");
sem_wait(&semafor);
pthread_mutex_lock(&zamek);
ja=indeks; //rejestracja
ident[ja]=nr;
on=(ja+1)%2;
indeks=on;
pthread_mutex_unlock(&zamek);
//spotkanie
//pthread_barrier_wait(&barrier);
printf("watek %d spotyka %d \n", ident[ja], ident[on]);
fflush(stdout);
//pthread_barrier_wait(&barrier);
printf("<----\n");
sem_post(&semafor);
}
return 0;
}
int main(int arg, char **argv) {
pthread_t w[liczba_watkow];
sem_init(&semafor, 0, 0);
sem_init(&semafor2, 0, 0);
sem_init(&semafor3, 0, 0);
sem_init(&semafor4, 0, 0);
pthread_mutex_init(&zamek, 0);
pthread_barrier_init(&barrier, 0, 2);
long i=0;
for (i=1;i<=liczba_watkow;i++)
pthread_create(&w[i-1],0,p,(void*)i);
for (i=0;i<liczba_watkow;i++)
pthread_join(w[i],0);
return 0;
}