在不相关的进程之间共享 futex
Share futex between unrelated processes
不相关的进程如何使用 futex 进行协作?
假设我有不相关的进程,一个是我的模块的 apache 子进程,另一个是例如一个后台脚本。
我想使用 futex 在两者之间建立一个带有互斥量的条件变量,以有利于用户-space 快速代码路径。
在我看来,存储互斥量的内存可能位于 mmap
文件中,如果该内存已映射,例如mlock
这两个进程理论上可以针对同一地址发出 futex 调用。
或者,也许可以使用 FUTEX_FD
.
将 futex 从一个进程传递到另一个进程
接受低级、高级和动态语言(C、C++、Python 等)的代码提交。 "robust futex"API也要支持
参考文献:
互斥体被定义为锁定对共享资源的访问。
这似乎不是你想要做的。
如果你想让两个进程合作,你可以使用共享mmap区域,或者信号量
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)
等待醒来:
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)
基本设置 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
吹毛求疵的完整代码:-) https://github.com/dimaqq/pthread_mutexattr_init/blob/master/xsem.py based on http://linux.die.net/man/3/pthread_mutexattr_init
不相关的进程如何使用 futex 进行协作?
假设我有不相关的进程,一个是我的模块的 apache 子进程,另一个是例如一个后台脚本。
我想使用 futex 在两者之间建立一个带有互斥量的条件变量,以有利于用户-space 快速代码路径。
在我看来,存储互斥量的内存可能位于 mmap
文件中,如果该内存已映射,例如mlock
这两个进程理论上可以针对同一地址发出 futex 调用。
或者,也许可以使用 FUTEX_FD
.
接受低级、高级和动态语言(C、C++、Python 等)的代码提交。 "robust futex"API也要支持
参考文献:
互斥体被定义为锁定对共享资源的访问。 这似乎不是你想要做的。
如果你想让两个进程合作,你可以使用共享mmap区域,或者信号量
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)
等待醒来:
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)
基本设置 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
吹毛求疵的完整代码:-) https://github.com/dimaqq/pthread_mutexattr_init/blob/master/xsem.py based on http://linux.die.net/man/3/pthread_mutexattr_init