2016-02-08 49 views
6

In che modo i processi non correlati possono cooperare utilizzando un futex?Condividi futex tra processi non collegati

Diciamo che ho processi non correlati, uno è, ad esempio, un sottoprocesso di apache con il mio modulo, un altro è ad es. uno script in background.

Vorrei stabilire una variabile di condizione con un mutex tra i due utilizzando un futex, a vantaggio del percorso del codice veloce dello spazio utente.

Mi sembra che la memoria in cui è memorizzato il mutex possa essere in un file mmap, se tale memoria è mappata, ad es. mlock 'i due processi potrebbero teoricamente emettere chiamate futex contro lo stesso indirizzo.

In alternativa, è possibile passare un futex da un processo a un altro utilizzando FUTEX_FD.

Immissioni di codice sono accettate lingue di basso, alto livello e dinamiche (C, C++, Python, ecc.). Anche l'API "robusta futex" deve essere supportata.

Riferimenti:

+0

P.S. Se ciò non può essere fatto, si prega di spiegare in dettaglio perché. –

+1

La [manpage dice] (http://man7.org/linux/man-pages/man7/pthreads.7.html) che pthreads usa internamente i futex. Hai considerato di utilizzare semplicemente l'API di alto livello (come [futex manpage recommend] (http://man7.org/linux/man-pages/man7/futex.7.html)) e utilizzare una condizione pthread con ' PTHREAD_PROCESS_SHARED'? – Phillip

+0

hai controllato questo http://locklessinc.com/articles/mutex_cv_futex/ – Ghayel

risposta

0

Grazie Phillip e Felix M. per i puntatori.

Python codice utente (file con strutture di dati esiste già, inizializzato con PTHREAD_PROCESS_SHARED)

with open("/tmp/semaphore", "rb+") as f: 
    m = mmap.mmap(f.fileno(), 0) # default: all file, share, read-write 

data = ffi.cast("unsigned long[3]", id(m))[2] # pointer to mapped area, 64-bit CPython 
lock = ffi.cast("pthread_mutex_t *", data) 
cond = ffi.cast("pthread_cond_t *", data + 40) 

@contextlib.contextmanager 
def locked(alock): 
    assert not C.pthread_mutex_lock(alock) 
    try: 
     yield 
    finally: 
     assert not C.pthread_mutex_unlock(alock) 

attesa e ottenere risvegliato:

if "wait" in sys.argv: 
    with locked(lock): 
     assert not C.pthread_cond_wait(cond, lock) 

elif "signal" in sys.argv: 
    with locked(lock): 
     assert not C.pthread_cond_signal(cond) 

basi della creazione PTHREAD_PROCESS_SHARED:

l = ffi.new("pthread_mutexattr_t *") 
assert not C.pthread_mutexattr_init(l) 
assert not C.pthread_mutexattr_setpshared(l, 1) # PTHREAD_PROCESS_SHARED 
assert not C.pthread_mutex_init(lock, l) 
# same for condition variable 

Codice completo per nitpicks :-) https://github.com/dimaqq/pthread_mutexattr_init/blob/master/xsem.py basato su http://linux.die.net/man/3/pthread_mutexattr_init

-1

mutex sono definiti per bloccare l'accesso alle risorse condivise. Questo non sembra quello che vuoi fare.

se si vuole sia di processo a collaborare, si può usare sia zona mmap condivisa o semaforo

+0

nota 'futex' nell'OP. Notare anche i commenti di Felix e Phillip –