1828 – Several Thread Issues

D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 1828 - Several Thread Issues
Summary: Several Thread Issues
Status: RESOLVED FIXED
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D2
Hardware: x86 Windows
: P2 critical
Assignee: Walter Bright
URL:
Keywords: patch
Depends on:
Blocks:
Reported: 2008年02月11日 19:04 UTC by Kazuhiro Inaba
Modified: 2015年06月09日 01:14 UTC (History)
2 users (show)

See Also:


Attachments
Patch to fix the issue (2.17 KB, patch)
2008年02月11日 19:04 UTC, Kazuhiro Inaba
Details | Diff
Add an attachment (proposed patch, testcase, etc.)

Note You need to log in before you can comment on or make changes to this issue.
Description Kazuhiro Inaba 2008年02月11日 19:04:01 UTC
// 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 Kazuhiro Inaba 2008年02月11日 19:04:45 UTC
Created attachment 226 [details] 
Patch to fix the issue
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)


AltStyle によって変換されたページ (->オリジナル) /