Adam Conner-Sax Wrote: > The attached code usually hangs (running on OSX, dmd 2.051). > > It uses spawn to create a new thread. All the thread does is create a large > array of doubles. In one case it uses the Array!double from std.container. In > the other case it uses the built in dynamic double. It declares the array, > sets the length, then sends a message to main saying it is finished and exits. > > The Array!double case always runs fine. The built-in dynamic array case > usually hangs, though not always in the same place. > > And the array has to be sufficiently big (in my case 200000 or bigger I think) > or the problem doesn't occur. > > I've no idea why. It took me a *long* time to find this since it manifested > as very mysterious hanging in a more complex piece of threaded code. Now I've > switched to using Array!double in my code and it all works fine.
This one is weird, and doesn't appear related to 4307. One of the threads (thread A) is in a GC collection and blocked trying to acquire the mutex protecting the global thread list within thread_resumeAll. Another thread (thread B) is also blocked trying to acquire this mutex for other reasons. My best guess is that pthread_mutex in OSX is trying to give ownership of the lock to thread B, and since thread B is suspended it effectively blocks thread A from acquiring it to resume execution after the GC cycle. Please submit a new issue for this. I suspect this is OSX-specific, since OSX doesn't use signaling to coordinate stop-the-world collections (signaling *should* prevent a thread from being suspended while waiting for a mutex, while the suspend mechanism in OSX doesn't seem to).