2016-02-08 27 views
6

W jaki sposób niezwiązane ze sobą procesy mogą współpracować przy użyciu futex?Udostępniaj futex pomiędzy niepowiązanymi procesami

Załóżmy, że mam niepowiązane procesy, z których jeden to, powiedzmy, podproces apache z moim modułem, inny jest np. skrypt w tle.

Chciałbym ustanowić zmienną warunkową z muteksem między tymi dwoma za pomocą futex, aby skorzystać na ścieżce szybkiego kodu przestrzeni użytkownika.

Wydaje mi się, że pamięć, w której zapisywany jest muteks, może znajdować się w pliku d, jeśli ta pamięć jest odwzorowana, np. mmap. mlock 'd te dwa procesy mogłyby teoretycznie wywoływać zaproszenia futex na ten sam adres.

Alternatywnie, być może futex może być przekazywany z jednego procesu do drugiego przy użyciu FUTEX_FD.

Zgłoszenia kodu akceptowane są języki niskie, wysokie i dynamiczne (C, C++, Python itp.). "Solidny futex" API musi być również wspierany.

Referencje:

+0

P.S. Jeśli nie można tego zrobić, proszę szczegółowo wyjaśnić, dlaczego. –

+1

Na stronie [manpage] (http://man7.org/linux/man-pages/man7/pthreads.7.html), że pthreads używa futexes wewnętrznie. Czy uważasz, że po prostu używasz API wysokiego poziomu (jak [rekomenduje futex manpage] (http://man7.org/linux/man-pages/man7/futex.7.html)) i użyj warunku pthread z '' PTHREAD_PROCESS_SHARED'? – Phillip

+0

Sprawdziłeś to http://locklessinc.com/articles/mutex_cv_futex/ – Ghayel

Odpowiedz

0

Dzięki Phillip i Felix M. dla wskaźników.

Python kodu użytkownika (plik ze struktur danych już istnieje, zainicjowane 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) 

poczekać i się obudził:

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) 

Podstawy ustalania 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 

Pełny kod dla nitek :-) https://github.com/dimaqq/pthread_mutexattr_init/blob/master/xsem.py na podstawie http://linux.die.net/man/3/pthread_mutexattr_init

-1

mutex są zdefiniowane, aby zablokować dostęp do udostępnionych zasobów. To nie wydaje się, co chcesz zrobić.

jeśli chcesz współpracować zarówno proces, można użyć udostępnionego obszaru mmap lub semafor

+0

notatka 'futex' w OP. Zwróć także uwagę na komentarze Felixa i Phillipa –

Powiązane problemy