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

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

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

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

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

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

引用:

  • https://www.kernel.org/doc/Documentation/robust-futexes.txt
  • http://locklessinc.com/articles/mutex_cv_futex/
  • 最佳答案

    感谢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.pyhttp://linux.die.net/man/3/pthread_mutexattr_init

    关于linux - 在不相关的流程之间共享激情,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35265781/

    10-11 02:38