July 25, 2020
Hi all,
  Who knows all about druntime's thread handling?

ThreadSanitizer is crashing upon the detaching of the main thread upon program termination [1]:
rt_term --> thread_term --> Thread.sm_main.__dtor() --> pthread_detach( m_addr )
then ThreadSanitizer hooks into pthread_detach and doesn't see the threadID in its database.

I'm wondering if we need this call at all in druntime?
What is the purpose of detaching our main thread?

This diff fixes the problem, and I don't see adverse effects yet...

diff --git a/src/core/thread/osthread.d b/src/core/thread/osthread.d
index b23cba7..40f8a55 100644
--- a/src/core/thread/osthread.d
+++ b/src/core/thread/osthread.d
@@ -727,7 +727,10 @@ class Thread
         }
         else version (Posix)
         {
-            pthread_detach( m_addr );
+            if (!isMainThread())
+            {
+                pthread_detach( m_addr );
+            }
             m_addr = m_addr.init;
         }
         version (Darwin)

Thanks,
  Johan

[1] https://github.com/ldc-developers/ldc/issues/3519