D issues are now
tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Summary: |
Several Thread Issues |
Product: |
D
|
Reporter: |
Kazuhiro Inaba <kinaba> |
Component: |
dmd | Assignee: |
Walter Bright <bugzilla> |
Status: |
RESOLVED
FIXED
|
Severity: |
critical
|
CC: |
sjguy, spam
|
Priority: |
P2
|
Keywords: |
patch |
Version: |
D2 |
Hardware: |
x86 |
OS: |
Windows |
Attachments: |
Patch to fix the issue
|
// 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 2
Stephen J. Guy
2008年02月28日 09:14:40 UTC
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
Stephan Dilly
2008年02月28日 12:14:51 UTC
pretty please apply this patch in the next release. i am encountering these mutlithreading crashes due to the GC, too.
Comment 4
Walter Bright
2008年03月07日 00:29:30 UTC
Fixed dmd 1.028 and 2.012 (and thanks for sorting this out)