Py_CLEAR(interp->audit_hooks);
- // At this time, all the threads should be cleared so we don't need atomic
- // operations for instrumentation_version or eval_breaker.
+ // gh-140257: Threads have already been cleared, but daemon threads may
+ // still access eval_breaker atomically via take_gil() right before they
+ // hang. Use an atomic store to prevent data races during finalization.
interp->ceval.instrumentation_version = 0;
- tstate->eval_breaker = 0;
+ _Py_atomic_store_uintptr(&tstate->eval_breaker, 0);
for (int i = 0; i < _PY_MONITORING_UNGROUPED_EVENTS; i++) {
interp->monitors.tools[i] = 0;