Programowanie współbieżne, problem spotkania

0

Witam, mam problem a mianowicie, jak przerobić poniższy kod tak aby działał za pomocą 4 semaforów 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.

#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;
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, 2);
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;

}

2

Zacząłbym od przeczytania tego:
https://greenteapress.com/semaphores/LittleBookOfSemaphores.pdf
Szukasz pod hasłem rendezvous.
Podejście proste: "rendezvous point" to 2 semafory, reszta powinna chyba pójść z górki ;)
Przy czym nie wiem czy to jest optymalne i może da się jeszcze prościej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1