2013-06-14 8 views
7

Sto provando a creare una memoria condivisa che verrà utilizzata da più processi. questi processi comunicano tra loro utilizzando le chiamate MPI (MPI_Send, MPI_Recv).Nome semaforo o gruppo che è migliore C linux

Ho bisogno di un meccanismo per controllare l'accesso di questa memoria condivisa Ho aggiunto una domanda ieri per vedere se MPI fornisce qualsiasi possibilità per farlo. Shared memory access control mechanism for processes created by MPI, ma sembra che non ci sia una simile disposizione da parte di MPI.

Quindi devo scegliere tra named semaphore o flock.

Per il semaforo denominato se uno dei processi muore improvvisamente senza chiamare sem_cloe(), di quel semaforo rimane sempre e può essere visto da ll /dev/shm/. Ciò si traduce talvolta in deadlock (se eseguo di nuovo lo stesso codice!), Per questo motivo attualmente sto pensando di utilizzare il flock.

Volevo solo verificare se flock è più adatto per questo tipo di operazione?

Ci sono degli svantaggi nell'uso di flock?

C'è qualcos'altro oltre a named semaphore e flock che può essere utilizzato qui?

Sto lavorando su C sotto linux.

risposta

8

È inoltre possibile utilizzare un mutex POSIX nella memoria condivisa; per prima cosa devi solo impostare l'attributo "pshared". Vedi pthread_mutexattr_setpshared. Questo è probabilmente il modo più diretto per fare ciò che vuoi.

Detto questo, è anche possibile chiamare sem_unlink sul semaforo con nome mentre lo si sta ancora utilizzando. Questo rimuoverà dal file system, ma l'oggetto semaforo sottostante continuerà ad esistere fino a quando l'ultimo processo chiama sem_close su di esso (che si verifica automaticamente se il processo termina o si interrompe).

Posso pensare a due piccoli svantaggi nell'uso di flock. Innanzitutto, non è POSIX, quindi rende il tuo codice un po 'meno portabile, anche se credo che molti Unix lo implementino nella pratica. Secondo, è implementato come una chiamata di sistema, quindi sarà più lento. Sia pthread_mutex_lock che sem_wait utilizzano il meccanismo "futex" su Linux, che fa solo una chiamata di sistema quando si deve attendere. Questa è solo una preoccupazione se stai afferrando e rilasciando molto il lucchetto.

+0

+1, ma vorrei solo aggiungere che 'gregge' e meccanismi simili non sono certamente una buona scelta. Sono progettati per proteggere l'uso simultaneo di file e per nient'altro. In particolare, se non accade nulla sul file, non viene specificato quando i metadati del file (come i blocchi) sono visibili per altri processi. Basta non usare questo per uno scopo per il quale non è stato progettato. –

Problemi correlati