// Credit goes to http://pc11.2ch.net/test/read.cgi/tech/1202623572/30-35n There are several problems in std.thread. Please find attached the patch to fix all of them. 1. Thread.start > state = TS.RUNNING; > hdl = _beginthreadex(null, cast(uint)stacksize, &threadstart, cast(void*)this, 0, &id); If context-switch occurs between these two lines, thread which acutually is not running is treated as TS.RUNNING. This causes problems, for example in pauseAll(). So these lines should be property synchronized. > if (hdl == cast(thread_hdl)0) When _beginthreadex fails and this branch is taken, the variable nthread should be decremented. 2. std.wait timeouts When a call to wait() timeouts (not fails), > dw = WaitForSingleObject(hdl, 0xFFFFFFFF); > state = TS.FINISHED; the current implemetation treats it as it fails. But in this case, the thread is indeed still alive and may wake up again just after the "state = TS.FINISHED" statement. If that happens, pauseAll() do not stop the thread (because it's TS.FINISHED) and multiple threads may unintendedly run parallel. This IS a problem for std.gc, which is relying on the assumption that pauseAll() stops all but gc threads. 3. Priority It is convenient if one can set the NORMAL thread priority.
Created attachment 226 [details] Patch to fix the issue
I applied this patch and it fixed an issue I was having. My program would eventually crash with either a "Win32 Error" or a "Error: Cannot Pause" error. This seemed to happen when my compute intensive threads were garbage collected, presumable for the exact reason Kazuhiro Inaba stated. Since recompiling Phobos with this patch, I have not encountered either error.
pretty please apply this patch in the next release. i am encountering these mutlithreading crashes due to the GC, too.
Fixed dmd 1.028 and 2.012 (and thanks for sorting this out)
AltStyle によって変換されたページ (->オリジナル) / アドレス: モード: デフォルト 音声ブラウザ ルビ付き 配色反転 文字拡大 モバイル