Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 30-12-2013, 06:32   #1
master1995
Member
 
Iscritto dal: Dec 2006
Messaggi: 71
[C] Problema Produttori Consumatori

Per preparami ad un esame di Programmazione concorrente devo risolvere un problema dei produttori consumatori definendo un oggetto buffer_t che mi rappresenta il buffer contenente D indice inserimento buffer circolare, T indice estrazione elementi buffer circolare e un buffer circolare che contiene dei messaggi del tipo msg_t *.
Io ho scritto il seguente codice:

Codice:
GestioneBuffer.c

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<string.h>
#define BUFFERERROR (msg_t *) NULL;
typedef char* stringa;
typedef struct msg {
    void* content;
// generico contenuto del messaggio
    struct msg * (*msg_init_string)(void*);
// creazione msg
    void (*msg_destroy_string)(struct msg *);
// deallocazione msg
    struct msg * (*msg_copy_string)(struct msg *); // creazione/copia msg
} msg_t;

typedef struct buffer{

    int K; //numero messaggi inseriti
    int N; //capacita bffer circolare
    int D;
    int T;
    msg_t **buffer_circolare;
    pthread_mutex_t mutex;
    pthread_cond_t non_pieno;
    pthread_cond_t non_vuoto;



}buffer_t;




void msg_destroy_string(msg_t* msg) {
    free(msg->content); // free copia privata
    free(msg);
// free struct
}

msg_t* msg_copy_string(msg_t* msg) {
    return msg->msg_init_string( msg->content );
}
msg_t* msg_init_string(void* content) {


//viene creata una copia "privata" della stringa
    msg_t* new_msg = (msg_t*)malloc( sizeof(msg_t) );
    char* string = (char*)content;
    char* new_content = (char*)malloc(strlen(string)+1); // +1 per \0 finale
    strcpy(new_content, string);
    new_msg->content=new_content;
    new_msg->msg_init_string=msg_init_string;
    new_msg->msg_destroy_string=msg_destroy_string;
    new_msg->msg_copy_string=msg_copy_string;
    return new_msg;
}

void buffer_destroy(buffer_t* buffer){
    free(buffer);
}

buffer_t* buffer_init(unsigned int maxsize){
    buffer_t *buffer;
    buffer = (buffer_t *)malloc(sizeof(buffer_t));
    buffer->buffer_circolare = malloc(maxsize*sizeof(msg_t));
    buffer->D=0;
    buffer->K=0;
    buffer->T=0;
    buffer->N=maxsize;
    pthread_mutex_init(&buffer->mutex,NULL);
    pthread_cond_init(&buffer->non_pieno,NULL);
    pthread_cond_init(&buffer->non_vuoto,NULL);
    return buffer;



}

msg_t* put_non_bloccante(buffer_t *buffer){

    pthread_mutex_lock(&buffer->mutex);

    if(buffer->K==buffer->N){
        printf("Il buffer è pieno e il mutex è rilasciato\n");
        pthread_mutex_unlock(&buffer->mutex);
        return NULL;

    }else{

        msg_t* msg=msg_init_string("Messaggio");
        buffer->buffer_circolare[buffer->D]=msg_copy_string(msg);
        printf("Il produttore inserisce il messaggio\n");
        buffer->D=(buffer->D+1)%buffer->N;
        buffer->K=buffer->K+1;
        pthread_cond_signal(&buffer->non_vuoto);
        pthread_mutex_unlock(&buffer->mutex);
        return msg;

    }
}



msg_t* put_bloccante(buffer_t *buffer){

        msg_t *msg = msg_init_string("Messaggio");
        pthread_mutex_lock(&buffer->mutex);

        while(buffer->K==buffer->N){
            printf("Il Produttore è in attesa che il buffer sia vuoto\n");
            pthread_cond_wait(&buffer->non_pieno,&buffer->mutex);


        }

        buffer->buffer_circolare[buffer->D]=msg_copy_string(msg);
        printf("Il produttore inserisce il messaggio\n");
        buffer->D=(buffer->D+1)%buffer->N;
        buffer->K=buffer->K+1;

        pthread_cond_signal(&buffer->non_vuoto);
        pthread_mutex_unlock(&buffer->mutex);
        return msg;

    /**}else return BUFFERERROR;*/

}

msg_t* get_bloccante(buffer_t* buffer){
    msg_t*result;
    pthread_mutex_lock(&buffer->mutex);

    while(buffer->K==0){
                printf("Il consumatore è in attesa che il buffer venga riempito\n");
                pthread_cond_wait(&buffer->non_vuoto,&buffer->mutex);


    }
    printf("Il consumatore preleva un messaggio\n");
    result=(msg_t*)malloc( sizeof(msg_t) );
    result=buffer->buffer_circolare[buffer->T];
    buffer->buffer_circolare[buffer->T]=NULL;
    buffer->T=(buffer->T+1)%buffer->N;
    buffer->K=buffer->K-1;
    pthread_cond_signal(&buffer->non_pieno);
    pthread_mutex_unlock(&buffer->mutex);
    return result;

}

msg_t* get_non_bloccante(buffer_t* buffer){
    pthread_mutex_lock(&buffer->mutex);
    if(buffer->K==0){
        printf("Il consumatore non preleva poiche buffer vuoto\n");
        pthread_mutex_unlock(&buffer->mutex);
        return NULL;

    }else{
        printf("Il consumatore preleva un messaggio\n");
        msg_t* result=(msg_t*)malloc( sizeof(msg_t) );
        result=msg_copy_string(buffer->buffer_circolare[buffer->T]);
        buffer->buffer_circolare[buffer->T]=NULL;
        buffer->T=(buffer->T+1)%buffer->N;
        buffer->K=buffer->K-1;
        pthread_cond_signal(&buffer->non_pieno);
        pthread_mutex_unlock(&buffer->mutex);
        return result;
    }
}

msg_t* dummy_produttore(buffer_t* buffer){
            msg_t *msg = msg_init_string("Messaggio");
            pthread_mutex_lock(&buffer->mutex);
            buffer->buffer_circolare[buffer->D]=msg_copy_string(msg);
            printf("Il produttore inserisce il messaggio\n");
            buffer->D=(buffer->D+1)%buffer->N;
            buffer->K=buffer->K+1;
            pthread_cond_signal(&buffer->non_vuoto);
            pthread_mutex_unlock(&buffer->mutex);
            return msg;


}

msg_t* dummy_consumatore(buffer_t* buffer){
        msg_t*result;
        pthread_mutex_lock(&buffer->mutex);
        printf("Il consumatore preleva un messaggio\n");
        result=(msg_t*)malloc( sizeof(msg_t) );
        result=buffer->buffer_circolare[buffer->T];
        buffer->buffer_circolare[buffer->T]=NULL;
        buffer->T=(buffer->T+1)%buffer->N;
        buffer->K=buffer->K-1;
        pthread_cond_signal(&buffer->non_pieno);
        pthread_mutex_unlock(&buffer->mutex);
        return result;

}
Cosi come l'ho scritto funziona ma non rispetta le specifiche dell'homework. Infatti i metodi put e get devono avere come parametri buffer_t* e msg_t*(per intenderci put_bloccante(buffer_t* buffer,msg_t* msg))
Io ho provato a scrivere il metodo put_bloccante in questo modo:
Codice:
msg_t* put_bloccante(buffer_t *buffer,msg_t* msg){

        msg = msg_init_string("Messaggio");
        pthread_mutex_lock(&buffer->mutex);

        while(buffer->K==buffer->N){
            printf("Il Produttore è in attesa che il buffer sia vuoto\n");
            pthread_cond_wait(&buffer->non_pieno,&buffer->mutex);


        }

        buffer->buffer_circolare[buffer->D]=msg_copy_string(msg);
        printf("Il produttore inserisce il messaggio\n");
        buffer->D=(buffer->D+1)%buffer->N;
        buffer->K=buffer->K+1;

        pthread_cond_signal(&buffer->non_vuoto);
        pthread_mutex_unlock(&buffer->mutex);
        return msg;

    /**}else return BUFFERERROR;*/

}
Ma se eseguo tale metodo(invocandolo nel main mediante pthread_create(&th1,NULL,put_bloccante,(buffer_vuoto,msg))) non mi viene visualizzato in output alcun tipo di messaggio.
Volevo sapere se qualcuno mi potesse aiutare nel trovare l'errore e farmi capire dove sbaglio
master1995 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
La Serie A con DAZN e Amazon Prime con l...
Giochi Ubisoft su Steam senza Ubisoft Co...
Miami Beach ha autorizzato la maxi opera...
Apple regala un altro anno di funzioni s...
Alla fine è successo davvero: Vol...
Il meglio di Amazon del weekend in uno s...
Speciale TV in offerta su Amazon: Hisens...
Non c'è pace per Trezor: 347.000 e-mail ...
È un portatile Dell e li vale tut...
Apple iPhone 17 Pro Max 256GB a 1.195€ (...
GPT-6 Astra è davvero AGI o non s...
LG OLED G6S 48'' a 845€ e G6 55'' a 1368...
Mantax Otax: il malware Android che crip...
Musk incassa un altro maxi contratto IA:...
Le vendite di EV sono esplose in tutto i...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 01:09.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v