【发布时间】:2014-04-17 10:16:58
【问题描述】:
我想用同步stop()方法实现一个线程。
我见过这样的版本:
class Thread1:
def __init__(self):
self._stop_event = threading.Event()
self._thread = None
def start(self):
self._thread = threading.Thread(target=self._run)
self._thread.start()
def stop(self):
self._stop_event.set()
self._thread.join()
def _run(self):
while not self._stop_event.is_set():
self._work()
def _work(self):
print("working")
但我读过原子操作是线程安全的,在我看来,它可以在没有Event 的情况下完成。所以我想出了这个:
class Thread2:
def __init__(self):
self._working = False
self._thread = None
def start(self):
self._working = True
self._thread = threading.Thread(target=self._run)
self._thread.start()
def stop(self):
self._working = False
self._thread.join()
def _run(self):
while self._working:
self._work()
def _work(self):
print("working")
它认为类似的实现在 C 中会被认为是不正确的,因为编译器可以将 _working 放入寄存器(甚至优化),并且工作线程永远不会知道变量已更改。类似的事情会发生在 Python 中吗?这个实现正确吗?我的目标不是完全避免事件或锁,只是想了解这个原子操作的东西。
【问题讨论】:
标签: python multithreading