不相关的流程如何使用futex合作?
假设我有不相关的进程,一个是例如我模块的apache子进程,另一个是例如背景脚本。
我想使用futex在两个变量之间建立一个互斥量的条件变量,以受益于用户空间快速代码路径。
在我看来,如果将互斥量存储的内存映射到(例如)内存,则该内存可能位于mmap
'd文件中。 mlock
'd这两个过程理论上可以针对相同的地址发出futex调用。
另外,也许可以使用FUTEX_FD
将futex从一个进程传递到另一个进程。
可以接受低级,高级和动态语言的代码提交(C,C++,Python等)。也必须支持“robust futex” API。
引用:
最佳答案
感谢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)
等待并唤醒:
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
nitpicks的完整代码:-)基于https://github.com/dimaqq/pthread_mutexattr_init/blob/master/xsem.py的http://linux.die.net/man/3/pthread_mutexattr_init
关于linux - 在不相关的流程之间共享激情,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35265781/