调用start()后,isAlive()能否立即返回False,因为线程尚未启动?

时间:2014-02-23 19:07:04

标签: python multithreading race-condition

http://docs.python.org/2/library/threading.html#thread-objects的python文档中,它说

  

[isAlive()]在run()方法启动之前返回True,直到run()方法终止后

然后start()方法说:

  

[start()]安排在单独的控制线程中调用对象的run()方法。

这是否意味着如果我致电t.start(),然后立即检查t.isAlive()我可能会False,因为线程尚未启动?

1 个答案:

答案 0 :(得分:6)

这种情况不可能发生,至少在CPython的实施中是这样。这来自于盯着Thread.start的代码(这里来自Python 3来源,但没关系):

def start(self):
    ...
    try:
        _start_new_thread(self._bootstrap, ())
    except Exception:
        with _active_limbo_lock:
            del _limbo[self]
        raise
    self._started.wait()

_start_new_thread()在C中实现,启动一个新线程并在该新线程中运行self._bootstrap()self._bootstrap()反过来调用self.run()。如果这就是全部,那么调用线程确实可以在run()开始执行之前返回任意时间量。但是:

    self._started.wait()

在内部Event的结尾处。引导代码在调用_started之前不久设置Event run(),同一事件的状态是isAlive()查看的主要内容。