Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214

    [C] Shared memory, problema di sincronizzazione

    Ciao a tutti ragazzi, apro un nuovo post per chiedervi delucidazioni sull'uso della memoria condivisa.
    Due processi indipendenti devono sincronizzarsi mediante semafori. Ho pensato di mettere i semafori in un segmento di memoria condivisa al quale i processi possono collegarsi, ma ho un problema di sincronizzazione. In pratica il processo A dovrebbe creare il segmento condiviso, e il processo B vi accede dopo che il processo A lo ha creato. Il punto è che il processo B "arriva prima" ad accedere alla memoria, bloccandosi. Tutti i segnali che in futuro gli vengono inviati dal processo A non vengono eseguiti, ho pensato che quindi il problema fosse proprio questo. Posto un po di pseudo-codice:

    Processo A:
    codice:
    //Inizializzazione
    //crea la shared memory e i semafori
    sem_init(&are_msg, 1, 0); 
    sem_init(&wake_server, 1, 0);
    sem_init(&wake_client, 1, 0); 
    
    shmid= shmget(key, 2048,IPC_CREAT|0666); 
    shm = (char*)shmat(shmid,NULL,0);
    printf("La shared mem. è all'indrizzo %p\n", shm); 
    are_msg = sem_open(SEM_NAME,0, 0644, 1); 
    wake_server = sem_open(SEM_SERV,0, 0644, 1);
    wake_client = sem_open(SEM_CLI, 0, 0644, 1); 
    shmid = shmget(key, SHMSZ,0666); 
    shm = (char*)shmat(shmid,NULL,SHM_W);
    printf("Sono collegato all'indirizzo: %p\n", shm);  
    
    //Produce msg, lo invia, e sveglia il client
    sem_post(&are_message);
    Processo B:
    codice:
    //Inizializzazione
    //si collega alla shared memory 
    wake_client = sem_open(SEM_CLI, 0, 0666, 1); 
    shmid = shmget(key, SHMSZ,0666); 
    shm = (char*)shmat(shmid,NULL,SHM_W);
    are_msg = sem_open(SEM_NAME,0, 0666, 1); 
    
    //Attende di essere svegliato dal server, non si sveglierà mai. 
    sem_wait(&are_msg);
    Per far in modo che il processo B si sospenda in attesa che il processo A crei la memoria, avrei bisogno di un ulteriore semaforo, che però dovrà essere allocato nella shared memory che ancora non c'è....

    Qualche consiglio?
    Il risultato che voglio ottenere è:
    Server si avvia Client si avvia

    Server si sospende Client sveglia il server e invia msg
    in attesa di un msg

    Server invia risposta e Client si sospende in attesa di risposta
    sveglia il client


    Dimenticavo di dire che avvio i due processi con un makefile nel quale specifico:
    ./ProcessoA
    ./ProcessoB

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Il codice del processo A non ha senso: sem_init() si usa per i semafori senza nome basati su memoria, sem_open() per i semafori con nome a persistenza su file system. Se usi questi ultimi, non hai bisogno di memoria condivisa visto che di fatto stai creando un file (ed il file system è per sua natura una risorsa condivisa tra i processi) al quale possono accedere tutti i processi che vuoi. Rivediti bene la documentazione dei semafori con nome.
    every day above ground is a good one

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Grazie, questo problema lo avevo risolto riscrivendo da capo il codice. Tra modifiche, copincolla, varie ed eventuali non ci si capiva più un gran che Ho utilizzato i semafori con nome ed è andato tutto bene

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.