2016-02-08 13 views
6

Làm thế nào để các quy trình không liên quan hợp tác bằng cách sử dụng một futex?Chia sẻ tương lai giữa các quy trình không liên quan

Giả sử tôi có các quy trình không liên quan, một là, một quy trình con apache với mô-đun của tôi, một quy trình khác, ví dụ: một kịch bản nền.

Tôi muốn thiết lập một biến điều kiện với một mutex giữa hai sử dụng một futex, để hưởng lợi cho đường dẫn mã nhanh không gian người dùng.

Dường như với tôi rằng bộ nhớ mà tại đó mutex được lưu trữ có thể nằm trong tệp mmap 'd, nếu bộ nhớ đó được ánh xạ, ví dụ: mlock 'd hai quy trình về mặt lý thuyết có thể ban hành các cuộc gọi futex chống lại cùng một địa chỉ.

Hoặc, có lẽ một futex có thể được chuyển từ quy trình này sang quy trình khác bằng cách sử dụng FUTEX_FD.

Việc gửi mã, ngôn ngữ cấp thấp, cấp cao và động được chấp nhận (C, C++, Python, v.v.). API "mạnh mẽ futex" cũng phải được hỗ trợ.

Tài liệu tham khảo:

+0

P.S. Nếu điều này không thể được thực hiện, vui lòng giải thích chi tiết tại sao. –

+1

[manpage nói] (http://man7.org/linux/man-pages/man7/pthreads.7.html) rằng pthreads sử dụng futexes trong nội bộ. Bạn có xem xét đơn giản sử dụng API cấp cao (như [manpage futex khuyến cáo] (http://man7.org/linux/man-pages/man7/futex.7.html)) và sử dụng điều kiện pthread với ' PTHREAD_PROCESS_SHARED'? – Phillip

+0

bạn đã kiểm tra http://locklessinc.com/articles/mutex_cv_futex/ – Ghayel

Trả lời

0

Cảm ơn PhillipFelix M. cho con trỏ.

Python mã người dùng (file với cấu trúc dữ liệu đã tồn tại, khởi tạo với 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) 

Chờ và nhận được đánh thức:

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) 

Khái niệm cơ bản của thiết 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 

Mã đầy đủ cho nitpicks :-) https://github.com/dimaqq/pthread_mutexattr_init/blob/master/xsem.py dựa trên http://linux.die.net/man/3/pthread_mutexattr_init

-1

mutex được định nghĩa để khóa quyền truy cập vào tài nguyên chia sẻ. Điều này dường như không giống như những gì bạn muốn làm.

nếu bạn muốn cả hai quá trình hợp tác, bạn có thể hoặc là sử dụng khu vực mmap chia sẻ, hoặc semaphore

+0

lưu ý 'futex' trong OP. Cũng lưu ý ý kiến ​​của Felix và Phillip –

Các vấn đề liên quan