不相关的过程如何使用futex进行协作?
假设我有不相关的进程,一个是,比方说,我的模块是apache子进程,另一个是后台脚本。
我想要建立一个条件变量之间的互斥之间使用一个futex,以利于用户空间的快速代码路径。
在我看来,存储互斥锁的内存可能位于一个mmap'd文件中,如果该内存被映射,例如,mlockd这两个进程理论上可以对同一个地址发出futex调用。
或者,可以使用FUTEX_FD从一个进程传递一个futex到另一个进程。
接受代码提交的低、高级和动态语言(C、C++、Python等)。“健壮的futex”API也必须得到支持。
参考文献:
发布于 2016-02-19 17:57:11
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-)基于init/blob/master/xsem.py的init代码
发布于 2016-02-18 14:59:01
互斥锁用于锁定对共享资源的访问。这似乎不是你想做的。
如果希望这两个进程合作,您可以使用共享mmap区域,也可以使用信号量。
https://stackoverflow.com/questions/35265781
复制相似问题