2016-02-08 8 views
6

無関係なプロセスはフューテックスを使用してどのように連携できますか?無関係なプロセス間でフューテックスを共有

私は無関係なプロセスを持っているとしましょう。一つは、モジュールとApacheのサブプロセスです。背景のスクリプト。

私は、フューテックスを使用して2つの間のミューテックスで条件変数を確立して、ユーザスペースの高速コードパスの利益を得たいと考えています。

mutexが格納されているメモリはmmapのファイルにある可能性があります。 mlock 'の2つのプロセスは理論的に同じアドレスに対してfutex呼び出しを発行できます。

あるいは、恐らくfutexはFUTEX_FDを使用してあるプロセスから別のプロセスに渡すことができます。

コード提出低、高水準、動的言語(C、C++、Pythonなど)が受け入れられます。 「堅牢なfutex」APIもサポートする必要があります。

参考文献:

+0

P.S.これができない場合は、理由を詳細に説明してください。 –

+1

pthreadsがフューテックスを内部的に使用する[manpage says](http://man7.org/linux/man-pages/man7/pthreads.7.html)。高水準API([futexマンページ推奨](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.いずれでもよいです。

Pythonのユーザーコード(データ構造を持つファイルがすでに存在している、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) 

待ちと目覚めます: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

OPの 'futex'に注意してください。また、FelixとPhillipによるコメント –

関連する問題