Dim*_*nek 6 linux process file-descriptor multiprocessing futex
不相关的流程如何使用futex进行合作?
假设我有不相关的进程,例如,一个是我的模块的apache子进程,另一个是例如后台脚本.
我想使用futex在两者之间建立一个带有互斥的条件变量,以便为用户空间快速代码路径带来好处.
在我看来,存储互斥锁的内存可能位于mmap'd文件中,如果该内存被映射,例如mlock,理论上两个进程可以针对相同的地址发出futex调用.
或者,也许可以使用futex从一个进程传递到另一个进程FUTEX_FD.
代码提交接受低级,高级和动态语言(C,C++,Python等).还必须支持"robust futex"API.
参考文献:
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)
Run Code Online (Sandbox Code Playgroud)
等待并醒来:
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)
Run Code Online (Sandbox Code Playgroud)
设置基础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
Run Code Online (Sandbox Code Playgroud)
挑剔的完整代码:-) https://github.com/dimaqq/pthread_mutexattr_init/blob/master/xsem.py基于http://linux.die.net/man/3/pthread_mutexattr_init
| 归档时间: |
|
| 查看次数: |
567 次 |
| 最近记录: |