おかげ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
P.S.これができない場合は、理由を詳細に説明してください。 –
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
あなたはこれをチェックしましたか?http://locklessinc.com/articles/mutex_cv_futex/ – Ghayel