https://github.com/python/cpython/commit/aa9ceb17215af21ed6618d6f7ccb5bf57ca57101
commit: aa9ceb17215af21ed6618d6f7ccb5bf57ca57101
branch: main
author: Abdul <[email protected]>
committer: colesbury <[email protected]>
date: 2025-09-15T11:13:37Z
summary:
gh-137017: Ensure `Thread.is_alive()` only returns False after the underlying
OS thread exits (gh-137315)
files:
A Misc/NEWS.d/next/Library/2025-08-01-23-11-25.gh-issue-137017.0yGcNc.rst
M Modules/_threadmodule.c
diff --git
a/Misc/NEWS.d/next/Library/2025-08-01-23-11-25.gh-issue-137017.0yGcNc.rst
b/Misc/NEWS.d/next/Library/2025-08-01-23-11-25.gh-issue-137017.0yGcNc.rst
new file mode 100644
index 00000000000000..7c2c013016d72e
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-08-01-23-11-25.gh-issue-137017.0yGcNc.rst
@@ -0,0 +1,3 @@
+Fix :obj:`threading.Thread.is_alive` to remain ``True`` until the underlying OS
+thread is fully cleaned up. This avoids false negatives in edge cases
+involving thread monitoring or premature :obj:`threading.Thread.is_alive`
calls.
diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c
index a436a553db9802..c6d07b1360711c 100644
--- a/Modules/_threadmodule.c
+++ b/Modules/_threadmodule.c
@@ -711,6 +711,9 @@ PyThreadHandleObject_is_done(PyObject *op, PyObject
*Py_UNUSED(dummy))
{
PyThreadHandleObject *self = PyThreadHandleObject_CAST(op);
if (_PyEvent_IsSet(&self->handle->thread_is_exiting)) {
+ if (_PyOnceFlag_CallOnce(&self->handle->once, join_thread,
self->handle) == -1) {
+ return NULL;
+ }
Py_RETURN_TRUE;
}
else {
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]