在不相关的进程之间共享futex

时间:2016-02-08 09:07:29

标签: linux process multiprocessing file-descriptor futex

不相关的流程如何使用futex进行合作?

假设我有不相关的进程,例如,一个是带有我的模块的apache子进程,另一个例如是背景脚本。

我想使用futex在两者之间建立一个带有互斥的条件变量,以便为用户空间快速代码路径带来好处。

在我看来,存储互斥锁的内存可能位于mmap'd文件中,如果该内存被映射,例如mlock这两个进程理论上可以针对相同的地址发出futex调用。

或者,也许可以使用FUTEX_FD将futex从一个进程传递到另一个进程。

代码提交接受低级,高级和动态语言(C,C ++,Python等)。 “强大的futex”API也必须得到支持。

参考文献:

2 个答案:

答案 0 :(得分:0)

感谢PhillipFelix 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

针对挑剔的完整代码:-) https://github.com/dimaqq/pthread_mutexattr_init/blob/master/xsem.py基于http://linux.die.net/man/3/pthread_mutexattr_init

答案 1 :(得分:-1)

定义互斥锁以锁定对共享资源的访问。 这似乎不是你想要做的。

如果您希望两个流程合作,您可以使用共享的mmap区域,也可以使用信号量