我有一个名为“lockingValue”的泛型类,可以被多个线程引用。这是为了防止竞争条件。
class lockingValue(object):
def __init__(self,value=None):
self._locked=False
self._value=value
def _lock(self):
while self._locked:
pass
self._locked = True
def _unlock(self):
self._locked = False
def update(self,val):
self._lock()
self._value=val
def value(self):
return copy.copy(self._value)
我正在寻找的是一种等待锁定获得免费的更好方法。以下内容容易与CPU挂钩,我想避免使用它。
def _lock(self):
while self._locked:
pass
self._locked = True
更新
我对更好和更好的建议和例子感兴趣更安全的设计来做这种内部过程的沟通和跟踪(例如,列出多个线程的进度)。
答案 0 :(得分:3)
import threading
class lockingValue(object):
def __init__(self,value=None):
self._lock = threading.Lock()
self._value = value
def _lock(self):
self._lock.acquire()
def _unlock(self):
self._lock.release()
def update(self, val):
self._lock()
self._value = val
self._unlock()
def value(self):
return copy.copy(self._value)
正如你的代码现在所说的那样,在你的_lock
方法中,有几个线程可以在while循环中等待,如果OS线程调度对你不利,它们中的多个可以同时使它脱离循环。
修改强>
根据khachik的评论更新update
以解锁。
答案 1 :(得分:3)
为什么不围绕Python自己的Lock对象包装你的类?然后你不必担心它是如何实现的。它甚至可以充当上下文管理器,因此您可以使用这样的可爱语法:
with myLock:
doSomething()