PDA

View Full Version : [c++]semafori


NA01
08-11-2003, 18:05
volevo fare una prova per usare i semafori e ho creato questo programma:
non fà altro che usare due 3d: uno legge da din i dati e l'altro li somma e li manda a schermo.
compilando questo programma con g++ -l pthread mi chiede la prima volta i dati, poi continua a sommare all'infinito, come se il semaforo non si decrementasse con sem_wait e risultasse quindi sempre positivo :eek:

dove è l'errore???

grazie mille

ciao

#include <pthread.h>
#include <iostream.h>
#include <semaphore.h>
#include <malloc.h>

struct dati{
int primo;
int secondo;
struct dati* next;
};
struct dati* dati_operazione;
pthread_mutex_t mutex_coda=PTHREAD_MUTEX_INITIALIZER;
sem_t coda;

void inizializzazione_coda(){
dati_operazione = NULL;
sem_init(&coda, 0, 0);
}

void* funzione_thread1(void* args){
int a;
int b;
int somma;
int contatore;
contatore = 0;
struct dati* lavoro;
while(1){
sem_wait(&coda);
pthread_mutex_lock(&mutex_coda);
lavoro = dati_operazione;
dati_operazione = dati_operazione->next;
pthread_mutex_unlock(&mutex_coda);
a = lavoro->primo;
b = lavoro->secondo;
somma = a + b;
cout << "la somma è" <<somma << "\n";
contatore ++;
cout << contatore;
}
}
void* aggiunta_coda(void* args){

int c;
int d;
cout <<"primo: ";
cin >> c;
cout << "\n" <<"secondo: ";
cin >> d;
struct dati* nuovo_lavoro;
nuovo_lavoro = (struct dati*) malloc(sizeof(struct dati));
while(1){
nuovo_lavoro->primo = c;
nuovo_lavoro->secondo = d;
pthread_mutex_lock(&mutex_coda);
nuovo_lavoro->next = dati_operazione;
dati_operazione = nuovo_lavoro;
sem_post(&coda);
pthread_mutex_unlock(&mutex_coda);
}
}


int main(){
pthread_t thread;
pthread_t thread1;
inizializzazione_coda();
pthread_create(&thread , NULL , funzione_thread1 , NULL);
pthread_create(&thread1, NULL ,aggiunta_coda , NULL);
pthread_join(thread , NULL);
pthread_join(thread1 , NULL);
}

NA01
08-11-2003, 18:07
piattaforma slack 9.1
g++ e gcc in versione 3.2.3

ciao

NA01
08-11-2003, 18:08
piattaforma slack 9.1
g++ e gcc in versione 3.2.3


altra domanda:
il manuale che stò leggendo parla solo di GNU/Linux, i sorgenti vanno bene anche con i sistemi unix o le librerie sono diverse?
ciao

NA01
09-11-2003, 16:50
uh! la modifica ha creato un'altro post???? :eek:

cmq questo è anche un uppino! (oltfre che una segnalazione di bug ;) )

ciao

NA01
10-11-2003, 15:50
ultimo up disperato!:mc: :mc: :mc: :cry: