Ciao a tutti

scusatemi non è che c'è qualche buon'anima in grado di rinfrescarmi la memoria?

è tutto il giorno che sto impazzendo su 4 righe di codice ma non mi riesce di sincronizzare 2 thread tramite semafori!!!

Posto il codice d'esempio, ho 2 thread che fanno un ciclo di 10 ognuno all'interno del ciclo attendo per un periodo diciamo random... mi aspetterei di ottenre un'output del tipo:

print_messagesB
print_messagesA
print_messagesB
print_messagesA
print_messagesB
print_messagesA
print_messagesB
print_messagesA

invece ho:

print_messagesB
print_messagesB
print_messagesB
print_messagesB
print_messagesB
print_messagesB
print_messagesB
print_messagesB
print_messagesB
print_messagesB
print_messagesA
print_messagesA
print_messagesA
print_messagesA
print_messagesA
print_messagesA
print_messagesA
print_messagesA
print_messagesA
print_messagesA

Questo è il codice: (comilo con: g++ test-thread.cc -lpthread)

codice:
#include <iostream>
#include <unistd.h>
#include <time.h>
#include <stdlib.h>
#include <semaphore.h>
#include <pthread.h>    /* POSIX Threads */

using namespace std;

void *print_messagesA ( void *ptr );
void *print_messagesB ( void *ptr );

typedef struct str_thdata
{
    int value;
    sem_t *mutex;
} thdata;


int main()
{
	pthread_t thread1, thread2;  /* thread variables */
	thdata data1, data2;         /* structs to be passed to threads */

	data1.value=1;
	data2.value=2;

	sem_t mutex;
	data1.mutex=&mutex;
	data2.mutex=&mutex;

	/*
	 * inizializzo il semaforo
	 */
	sem_init(&mutex, 0,0);
    pthread_create (&thread1, NULL,print_messagesA, (void *) &data1);
    pthread_create (&thread2, NULL,print_messagesB, (void *) &data2);

    /*
     * avvio a caso uno dei processi
     */
	sem_post(&mutex);

	pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);

	return 0;
}


void *print_messagesA ( void *ptr ){

	thdata* param=(thdata*)ptr;
	int value;

	for(int i=0;i<10;i++){
		// attendo uno sblocco
		sem_wait(param->mutex);
		cout << "print_messagesA"<<endl;
		// attendo un periodo casuale
		usleep(rand()/1000);
		// sblocco
		sem_post(param->mutex);
	}
	pthread_exit(0);
}

void *print_messagesB ( void *ptr ){

	thdata* param=(thdata*)ptr;
	int value;

	for(int i=0;i<10;i++){
		// attendo uno sblocco
		sem_wait(param->mutex);
		cout << "print_messagesB"<<endl;
		// attendo un periodo casuale
		usleep(rand()/1000);
		// sblocco
		sem_post(param->mutex);

	}
	pthread_exit(0);
}
Dove sto sbagliando?

Grazie a tutti