6

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

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

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

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

或者,也许 futex 可以使用FUTEX_FD.

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

参考:

4

2 回答 2

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

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

于 2016-02-19T17:57:11.687 回答
-1

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

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

于 2016-02-18T14:59:01.227 回答