Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Grazie ad un mocio rotante che viene costantemente bagnato e pulito, Narwal Flow assicura un completo e capillare lavaggio dei pavimenti di casa. La logica di intellignza artificiale integrata guida nella pulizia tra i diversi locali, sfruttando un motore di aspirazione molto potente e un sistema basculante per la spazzola molto efficace sui tappeti di casa
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi
Con un prezzo di 2.999 euro, il Panasonic Z95BEG entra nella fascia ultra-premium dei TV OLED: pannello Primary RGB Tandem, sistema di raffreddamento ThermalFlow, audio Technics integrato e funzioni gaming avanzate lo pongono come un punto di riferimento
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione
Abbiamo provato per diverse settimane il nuovo Magic V5 di HONOR, uno smartphone pieghevole che ci ha davvero stupito. Il device è il più sottile (solo 4.1mm) ma non gli manca praticamente nulla. Potenza garantita dallo Snapdragon 8 Elite, fotocamere di ottima qualità e batteria in silicio-carbonio che garantisce un'ottima autonomia. E il Prezzo? Vi diciamo tutto nella nostra recensione completa.
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


Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio Narwal Flow: con il mocio orizzontale lava i pav...
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi Panasonic 55Z95BEG cala gli assi: pannello Tande...
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione HONOR Magic V5: il pieghevole ultra sottile e co...
Recensione Google Pixel 10 Pro XL: uno zoom 100x assurdo sempre in tasca (e molto altro) Recensione Google Pixel 10 Pro XL: uno zoom 100x...
Lenovo IdeaPad Slim 3: un notebook Snapdragon X economico Lenovo IdeaPad Slim 3: un notebook Snapdragon X ...
Google nella bufera, multata dall'UE per...
Huawei rinnova la sua gamma di cuffie: e...
La connettività satellitare di Am...
MOVA ha presentato un robot aspirapolver...
Super e-bike con telaio in carbonio e se...
Tineco porta molte novità per la ...
Dreame conquista l’IFA 2025: nuovi V30 e...
BYD Seal 6 DM-i ufficiale in Italia: il ...
Il telescopio spaziale James Webb ha cat...
X Money in stallo: bloccati i piani di E...
OpenAI Jobs: l'intelligenza artificiale ...
Roborock si espande a IFA: una panoramic...
Lenovo Innovation World 2025: l’IA diven...
Amazon Warehouse Seconda Mano: ultime or...
Spielberg voleva dirigere il film di Cal...
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: 05:19.


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