diff --git a/Lib/threading.py b/Lib/threading.py --- a/Lib/threading.py +++ b/Lib/threading.py @@ -552,6 +552,10 @@ self._tstate_lock = None self._started = Event() self._stopped = Event() + # _is_stopped should be the same as _stopped.is_set(). The bizarre + # duplication is to allow test_is_alive_after_fork to pass on old + # Linux kernels. See issue 18808. + self._is_stopped = False self._initialized = True # sys.stderr is not stored in the class like # sys.exc_info since it can be changed between instances @@ -707,6 +711,7 @@ def _stop(self): self._stopped.set() + self._is_stopped = True def _delete(self): "Remove current thread from the dict of currently running threads." @@ -793,7 +798,7 @@ assert self._initialized, "Thread.__init__() not called" if not self._started.is_set(): return False - if not self._stopped.is_set(): + if not self._is_stopped: return True # The Python part of the thread is done, but the C part may still be # waiting to run.