* calls fork() without an immediate exec(), both of which have undefined
     * behavior in a multithreaded program.  A multithreaded postmaster is the
     * normal case on Windows, which offers neither fork() nor sigprocmask().
+    * Currently, macOS is the only platform having pthread_is_threaded_np(),
+    * so we need not worry whether this HINT is appropriate elsewhere.
     */
    if (pthread_is_threaded_np() != 0)
        ereport(FATAL,
 
    /*
     * There is no known cause for a postmaster to become multithreaded after
-    * startup.  Recheck to account for the possibility of unknown causes.
+    * startup.  However, we might reach here via an error exit before
+    * reaching the test in PostmasterMain, so provide the same hint as there.
     * This message uses LOG level, because an unclean shutdown at this point
     * would usually not look much different from a clean shutdown.
     */
    if (pthread_is_threaded_np() != 0)
        ereport(LOG,
-               (errcode(ERRCODE_INTERNAL_ERROR),
-                errmsg_internal("postmaster became multithreaded"),
-                errdetail("Please report this to <%s>.", PACKAGE_BUGREPORT)));
+               (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
+                errmsg("postmaster became multithreaded"),
+                errhint("Set the LC_ALL environment variable to a valid locale.")));
 #endif
 
    /* should cleanup shared memory and kill all backends */