Domanda

Mi piacerebbe usare i semafori POSIX per gestire get atomica e mettere da un file che rappresenta una coda. Voglio che la flessibilità di avere qualcosa chiamato nel filesystem, in modo che i processi completamente indipendenti possono condividere una coda. Credo che questo piano esclude pthreads. I semafori POSIX nome sono grandi per mettere qualcosa nel filesystem che qualsiasi processo può vedere, ma non riesco a trovare il CondWait standard di primitivo:

... decide we have to wait ....
CondWait(sem, cond);

Quando CondWait viene chiamato da un processo IT atomicamente messaggi al SEM e attende sulla cond. Quando alcuni altri posti di processo la cond, il processo in attesa si sveglia solo se può atomicamente decremento sem pure. L'alternativa di

... decide we have to wait ....
sem_post(sem);
sem_wait(cond);
sem_wait(sem);

è soggetto ad una condizione di competizione in cui alcuni altri segnali di processo cond poco prima di questo processo attende su di esso.

ho quasi mai fare alcuna programmazione concorrente, così ho pensato di chiedere SO:? Se io uso un semaforo conteggio POSIX standard per la variabile di condizione, è possibile che questa gara è benigna

Nel caso in cui qualcuno vuole un contesto più ampio, sto costruendo get e messo le operazioni per una coda atomica che può essere chiamato da script di shell.

È stato utile?

Soluzione

Dal momento che non ci sono altre risposte I will follow up con quello che ho imparato:

  • Pthread non funzionerà con la mia domanda perché ho processi senza un antenato comune che hanno bisogno di condividere una coda atomica.
  • Posix semafori sono soggetti alla gara di sveglia di compagnia, ma i semafori perché a differenza classiche variabili di condizione che contano , la gara è benigno. Non ho una prova di questa affermazione, ma ho avuto un sistema che esegue da due giorni e funziona bene. (Completamente senza senso lo so, ma almeno significava ho ottenuto il lavoro fatto.)
  • semafori Posix nome sono difficile da garbage-raccolgono dal filesystem .

In sintesi, i semafori Posix nome si è rivelato essere un buona base per l'attuazione un'astrazione coda atomica per essere condiviso tra i processi indipendenti .

Mi piacerebbe avere una prova o di un modello SPIN convalidato, ma come il mio bisogno per l'applicazione è limitata, sembra improbabile che scriverò uno. Spero che questo aiuta qualcun altro che può decidere di utilizzare i semafori POSIX.

Altri suggerimenti

Secondo la norma la POSIX , l'insieme di routine semaforo è:

  • sem_close ()
  • sem_destroy ()
  • sem_getvalue ()
  • sem_init ()
  • sem_open ()
  • sem_post ()
  • sem_timedwait ()
  • sem_trywait ()
  • sem_unlink ()
  • sem_wait ()

Il sem_trywait() e sem_timedwait() funzioni potrebbero essere quello che stai cercando.

So che questa domanda è vecchio, ma la soluzione più ovvia sarebbe quella di utilizzare solo le variabili di processo condiviso i mutex e condizioni situato in un file puoi mmap.

La vostra ricerca: pthread_cond_wait, pthread_cond_signal, credo
. Questo è se si sta utilizzando i thread POSIX, allora i metodi di pthread avrebbero fornire la funzionalità di CondWait e Signal.
Guardate qui per il codice sorgente su pthreads multiprocess tramite memoria condivisa.
http://linux.die.net/man/3/pthread_mutexattr_init
Questo è per Linux, ma i documenti sono POSIX. Sono simili a Solaris, ma ti consigliamo di sfogliare le pagine man sul proprio sistema operativo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top