您的位置:首页 > 编程语言 > Python开发

Locking with Deadlock Avoidance

2015-10-06 13:05 459 查看
import threading

from contextlib import contextmanager

_local = threading.local()

@contextmanager

def acquire(*locks):

locks = sorted(locks, key=lambda x: id(x))

acquired = getattr(_local, 'acquired', [])

if acquired and max(id(lock) for lock in acquired) >= id(locks[0]):

raise RuntimeError('Lock Order Voilation')

acquired.extend(locks)

_local.acquired = acquired

try:

for lock in locks:

lock.acquire()

yield

finally:

for lock in reversed(locks):

lock.release()

del acquired[-len(locks):]

#example usuage:

x_lock = threading.Lock()

y_lock = threading.Lock()

def thread_1():

while True:

with acquire(x_lock, y_lock):

print('Thread-1')

def thread_2():

while True:

with acquire(y_lock, x_lock):

print('Thread-2')


Use python’s object id to sort locks, can use lock’s memory address instead in C/C++.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python