Mutex, lettori, scrittori e Array.

di il
2 risposte

Mutex, lettori, scrittori e Array.

Salve a tutti, avrei bisogno di un aiuto per risolvere questo esercizio:
Implementare il problema dei lettori e scrittori utilizzando semafori e mutexforniti da pthreads. Generare 1 scrittore che scrive su un vettore (condiviso!) int A[100]. Ogni 5 secondi lo scrittore scrive un numero in una locazione di A[]. Creare 2 thread che ad intervalli regolari e diversi leggono e stampano avideo il contenuto di A.

Questo qui sotto è il codice che ho scritto per ora, ma ovviamente è da completare e sistemare. Il punto è che ignoro come implementare i comandi (o funzioni) di lettura e scrittura (anche perchè avendoci inziato da poco non ho molta dimistichezza al riguardo), che per l'appunto devo ancora inserire. Se mi potreste gentilmente dare una mano a risolvere questo esercizio ve ne sarei grato.

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define MAX 100

pthread_mutex_t M; /* def.mutex condiviso dei readers threads */
Static sem_t W /* def.semaforo del writer thread */

int A[MAX]; /* Array condiviso */
int rc = 0;

void *writer_process (void * arg)
{
for(int k=0; k<MAX; k++){
sem_wait(&W); /*prologo */
mettere write
sem_post(&W); /*epilogo */
sleep(5);
}
pthread_exit (0);
}

void *reader1_process (void * arg)
{
{
pthread_mutex_lock(&M); /*prologo sez. critica */
rc++;
if (rc=1) then sem_wait(&W)
pthread_mutex_unlock(&M); /*epilogo sez. critica*/
mettere read
printf("accessi di T2: %d\n", accessi2); metti printf qui
pthread_mutex_lock(&M); /*prologo sez. critica */
rc--;
if (rc=0) then sem_post(&W)
pthread_mutex_unlock(&M); /*epilogo sez. critica*/
sleep(3);
}
pthread_exit (0);
}


void *reader2_process (void * arg)
{
{
pthread_mutex_lock(&M); /*prologo sez. critica */
rc++;
if (rc=1) then sem_wait(&W)
pthread_mutex_unlock(&M); /*epilogo sez. critica*/
mettere read
printf("accessi di T2: %d\n", accessi2); metti printf qui
pthread_mutex_lock(&M); /*prologo sez. critica */
rc--;
if (rc=0) then sem_post(&W)
pthread_mutex_unlock(&M); /*epilogo sez. critica*/
sleep(4);
}
pthread_exit (0);
}

int main ()

{
pthread_t wr, rd1, rd2;
/* il mutex e` inizialmente libero: */
pthread_mutex_init (&M, 1);

sem_init(&W,0,1);

if (pthread_create(&wr, NULL, writer_process, NULL) < 0)
{ fprintf (stderr, "create error for thread 1\n");
exit (1);
}

if (pthread_create(&rd1, NULL, reader1_process, NULL) < 0)
{ fprintf (stderr, "create error for thread 1\n");
exit (1);
}
if (pthread_create(&rd2, NULL, reader2_process,NULL) < 0)
{ fprintf (stderr, "create error for thread 2\n");
exit (1);
}
pthread_join (wr, NULL);
pthread_join (rd1, NULL);
pthread_join (rd2, NULL);
}

Mi auguro di non aver sbagliato sezione.

2 Risposte

  • Re: Mutex, lettori, scrittori e Array.

    Usa il pulsate </>
  • Re: Mutex, lettori, scrittori e Array.

    Secondo me bastano i semafori per quanto chiede la traccia
    
    #include <stdio.h>
    #include <pthread.h>
    #include <semaphore.h>
    #include <time.h>
    
    #define MAX 10
    int A[MAX];
    
    sem_t W1, W2;
    
    void * writer_process(void * arg){
        int i = 0;
        time_t start = time(0), s, t = 0;
        while(t < 5 * MAX){
            s = time(0) - start;
            if(t != s){
                t = s;
                s = t % 5;
                if(s == 1){
                    A[i] = i + 1;   
                    i++;
                }
                else if(s == 2)
                    sem_post(&W1);  
                else if(s == 3)
                    sem_post(&W2);             
            }
        }
    }
    
    void * reader1_process(void * arg){
        for(int i = 0; i < MAX; i++){
            sem_wait(&W1);
            printf("Lettore 1 legge A[%d] = %d\n", i, A[i]);
        }
    }
    
    void * reader2_process(void * arg){
        for(int i = 0; i < MAX; i++){
            sem_wait(&W2);
            printf("Lettore 2 legge A[%d] = %d\n", i, A[i]);
        }
    }
    
    int main(){
        pthread_t wr, rd1, rd2;
    
        sem_init(&W1,0,0);
        sem_init(&W2,0,0);
    
        pthread_create( &wr, NULL,  writer_process, NULL);
        pthread_create(&rd1, NULL, reader1_process, NULL);    
        pthread_create(&rd2, NULL, reader2_process, NULL);    
    
        pthread_join( wr, NULL);
        pthread_join(rd1, NULL);
        pthread_join(rd2, NULL);
        
        return 0;
    }
    
Devi accedere o registrarti per scrivere nel forum
2 risposte