diff --git a/test/-ext-/thread/test_instrumentation_api.rb b/test/-ext-/thread/test_instrumentation_api.rb
index a187a3c13f..dd620e7380 100644
--- a/test/-ext-/thread/test_instrumentation_api.rb
+++ b/test/-ext-/thread/test_instrumentation_api.rb
@@ -87,6 +87,5 @@ class TestThreadInstrumentation < Test::Unit::TestCase
 
   def assert_global_join_counters(counters)
     assert_equal THREADS_COUNT, counters.first
-    assert_include 0..THREADS_COUNT, counters.last # It's possible that a thread didn't execute its EXIT hook yet.
   end
 end
diff --git a/thread.c b/thread.c
index 7d1a4ee3fb..b9e9323801 100644
--- a/thread.c
+++ b/thread.c
@@ -631,6 +631,7 @@ thread_do_start(rb_thread_t *th)
 }
 
 void rb_ec_clear_current_thread_trace_func(const rb_execution_context_t *ec);
+#define thread_sched_to_dead thread_sched_to_waiting
 
 static int
 thread_start_func_2(rb_thread_t *th, VALUE *stack_start)
diff --git a/thread_none.c b/thread_none.c
index 00004ed4dd..cf4658e571 100644
--- a/thread_none.c
+++ b/thread_none.c
@@ -30,8 +30,6 @@ thread_sched_to_waiting(struct rb_thread_sched *sched)
 {
 }
 
-#define thread_sched_to_dead thread_sched_to_waiting
-
 static void
 thread_sched_yield(struct rb_thread_sched *sched, rb_thread_t *th)
 {
diff --git a/thread_pthread.c b/thread_pthread.c
index 8597479765..86ad279d7c 100644
--- a/thread_pthread.c
+++ b/thread_pthread.c
@@ -448,13 +448,6 @@ thread_sched_to_waiting(struct rb_thread_sched *sched)
     rb_native_mutex_unlock(&sched->lock);
 }
 
-static void
-thread_sched_to_dead(struct rb_thread_sched *sched)
-{
-    thread_sched_to_waiting(sched);
-    RB_INTERNAL_THREAD_HOOK(RUBY_INTERNAL_THREAD_EVENT_EXITED);
-}
-
 static void
 thread_sched_yield(struct rb_thread_sched *sched, rb_thread_t *th)
 {
@@ -1177,6 +1170,8 @@ thread_start_func_1(void *th_ptr)
 #else
         thread_start_func_2(th, &stack_start);
 #endif
+
+        RB_INTERNAL_THREAD_HOOK(RUBY_INTERNAL_THREAD_EVENT_EXITED);
     }
 #if USE_THREAD_CACHE
     /* cache thread */
diff --git a/thread_win32.c b/thread_win32.c
index 714d601340..81fea585ac 100644
--- a/thread_win32.c
+++ b/thread_win32.c
@@ -137,8 +137,6 @@ thread_sched_to_waiting(struct rb_thread_sched *sched)
     ReleaseMutex(sched->lock);
 }
 
-#define thread_sched_to_dead thread_sched_to_waiting
-
 static void
 thread_sched_yield(struct rb_thread_sched *sched, rb_thread_t *th)
 {