2016-02-08 11 views
6

असंबद्ध प्रक्रियाएं futex का उपयोग करके सहयोग कैसे कर सकती हैं?असंबद्ध प्रक्रियाओं के बीच futex साझा करें

मान लें कि मेरे पास असंबंधित प्रक्रियाएं हैं, एक कहें, मेरे मॉड्यूल के साथ एक अपाचे सबप्रोसेस, एक और उदाहरण एक पृष्ठभूमि लिपि।

मैं उपयोगकर्ता-स्पेस फास्ट कोड पथ के लाभ के लिए, एक futex का उपयोग करके दोनों के बीच एक म्यूटेक्स के साथ एक कंडीशन चर स्थापित करना चाहता हूं।

ऐसा लगता है कि जिस स्मृति पर म्यूटेक्स संग्रहीत किया जाता है वह mmap 'डी फ़ाइल में हो सकता है, अगर उस मेमोरी को मैप किया गया है, उदा। mlock 'डी दो प्रक्रियाओं सैद्धांतिक रूप से उसी पते के खिलाफ futex कॉल जारी कर सकता है।

वैकल्पिक रूप से, शायद एक फ़्यूटेक्स को FUTEX_FD का उपयोग करके एक प्रक्रिया से दूसरे में पारित किया जा सकता है।

कोड सबमिशन कम, उच्च स्तर और गतिशील भाषाओं को स्वीकार किया जाता है (सी, सी ++, पायथन, आदि)। "मजबूत फूटेक्स" एपीआई भी समर्थित होना चाहिए।

संदर्भ:

+0

पीएस यदि यह नहीं किया जा सकता है, तो विस्तार से बताएं कि क्यों। –

+1

[मैनपेज कहता है] (http://man7.org/linux/man-pages/man7/pthreads.7.html) कि pthreads आंतरिक रूप से futexes का उपयोग करता है। क्या आपने केवल उच्च स्तरीय एपीआई का उपयोग करने पर विचार किया था (जैसा कि [futex manpage अनुशंसा करता है] (http://man7.org/linux/man-pages/man7/futex.7.html)), और 'pthread स्थिति' PTHREAD_PROCESS_SHARED'? – Phillip

+0

क्या आपने यह http://locklessinc.com/articles/mutex_cv_futex/ – Ghayel

उत्तर

0

धन्यवाद Phillip और Felix M. संकेत के लिए या तो हो सकता है।

अजगर उपयोगकर्ता कोड

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) 

प्रतीक्षा (पहले से मौजूद डेटा संरचनाओं, PTHREAD_PROCESS_SHARED साथ initialised साथ फ़ाइल) और awoken हो:

PTHREAD_PROCESS_SHARED स्थापित करने की
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) 

मूल बातें:

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 

नाइटपिक्स के लिए पूर्ण कोड :-) https://github.com/dimaqq/pthread_mutexattr_init/blob/master/xsem.py पर आधारित http://linux.die.net/man/3/pthread_mutexattr_init

-1

म्युटेक्स साझा संसाधनों तक पहुँच लॉक करने के लिए परिभाषित कर रहे हैं। ऐसा प्रतीत नहीं होता कि आप क्या करना चाहते हैं।

तुम दोनों प्रक्रिया चाहते हैं, तो सहयोग करने के लिए, आप साझा mmap क्षेत्र का उपयोग करें, या सेमाफोर

+0

नोट 'futex'। फ़ेलिक्स और फिलिप द्वारा टिप्पणियां भी नोट करें –

संबंधित मुद्दे