首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不相关进程之间共享futex

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

Stack Overflow用户
提问于 2016-02-08 09:07:29
回答 2查看 971关注 0票数 6

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

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

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

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

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

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

参考文献:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-19 17:57:11

感谢PhillipFelix M.的指点。

Python代码(数据结构的文件已经存在,用PTHREAD_PROCESS_SHARED初始化)

代码语言:javascript
复制
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)

等着醒过来:

代码语言:javascript
复制
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的基础

代码语言:javascript
复制
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.pyinit代码

票数 0
EN

Stack Overflow用户

发布于 2016-02-18 14:59:01

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35265781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档