2003-10-26 Michael Chastain <mec@shout.net>

* gdb.texinfo (Thread Stops): Document the issue with
	premature return from system calls in multi-threaded programs.
This commit is contained in:
Michael Chastain
2003-10-27 13:59:08 +00:00
parent 50c2245bd8
commit 36d86913b5
2 changed files with 46 additions and 0 deletions

View File

@ -1,3 +1,8 @@
2003-10-26 Michael Chastain <mec@shout.net>
* gdb.texinfo (Thread Stops): Document the issue with
premature return from system calls in multi-threaded programs.
2003-10-24 Andrew Cagney <cagney@redhat.com>
* annotate.texinfo: Fix "fortunatly"[sic].

View File

@ -3761,6 +3761,47 @@ allows you to examine the overall state of the program, including
switching between threads, without worrying that things may change
underfoot.
@cindex thread breakpoints and system calls
@cindex system calls and thread breakpoints
@cindex premature return from system calls
There is an unfortunate side effect. If one thread stops for a
breakpoint, or for some other reason, and another thread is blocked in a
system call, then the system call may return prematurely. This is a
consequence of the interaction between multiple threads and the signals
that @value{GDBN} uses to implement breakpoints and other events that
stop execution.
To handle this problem, your program should check the return value of
each system call and react appropriately. This is good programming
style anyways.
For example, do not write code like this:
@smallexample
sleep (10);
@end smallexample
The call to @code{sleep} will return early if a different thread stops
at a breakpoint or for some other reason.
Instead, write this:
@smallexample
int unslept = 10;
while (unslept > 0)
unslept = sleep (unslept);
@end smallexample
A system call is allowed to return early, so the system is still
conforming to its specification. But @value{GDBN} does cause your
multi-threaded program to behave differently than it would without
@value{GDBN}.
Also, @value{GDBN} uses internal breakpoints in the thread library to
monitor certain events such as thread creation and thread destruction.
When such an event happens, a system call in another thread may return
prematurely, even though your program does not appear to stop.
@cindex continuing threads
@cindex threads, continuing
Conversely, whenever you restart the program, @emph{all} threads start