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);
}
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);
}