Bug 1828 – Several Thread Issues

Status
RESOLVED
Resolution
FIXED
Severity
critical
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
x86
OS
Windows
Creation time
2008-02-11T19:04:00Z
Last change time
2015-06-09T01:14:30Z
Keywords
patch
Assigned to
bugzilla
Creator
kinaba

Attachments

IDFilenameSummaryContent-TypeSize
226thread.d.diffPatch to fix the issuetext/plain2221

Comments

Comment #0 by kinaba — 2008-02-11T19:04:01Z
// 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.
Comment #1 by kinaba — 2008-02-11T19:04:45Z
Created attachment 226 Patch to fix the issue
Comment #2 by sjguy — 2008-02-28T09:14:40Z
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.
Comment #3 by spam — 2008-02-28T12:14:51Z
pretty please apply this patch in the next release. i am encountering these mutlithreading crashes due to the GC, too.
Comment #4 by bugzilla — 2008-03-07T00:29:30Z
Fixed dmd 1.028 and 2.012 (and thanks for sorting this out)