In this section, we’ll write some simple multi-threaded programs and use a specific tool, called helgrind, to find problems in these programs.
Read the README in the homework download for details on how to build the programs and run helgrind.
Do not copy/paste all output of valgrind, only the parts, where your answers rely on. Run your tests on the bsys container (not your notebook!).
First build main-race.c. Examine the code so you can see the (hopefully
obvious) data race in the code. Now run helgrind (by typing valgrind
--tool=helgrind main-race) to see how it reports the race. Does it point to
the right lines of code? What other information does it give to you?
Correkt your code:
What happens when you remove one of the offending lines of code?
Now add a lock around one of the updates to the shared variable,
and then around both.
What does helgrind report in each (2.1, 2.2 and 2.3) of these cases?
Checkin your corrected file main-race.
Now let’s look at main-deadlock.c. Examine the code. This code has a
problem known as deadlock (which we discuss in much more depth in a
forthcoming chapter). Can you see what problem it might have? Does the
program run? Explain!
Now run helgrind on this code. What does helgrind report? Do not copy the output into your answers, explain what helgrind tells you!
Now run helgrind on main-deadlock-global.c.
Examine the code; does it have the same problem that main-deadlock.c
has?
Run the program.
Should helgrind be reporting the same error?
What does this tell you about tools like helgrind?
Let’s next look at main-signal.c. This code uses a variable (done) to
signal that the child is done and that the parent can now continue. Why is
this code inefficient? (what does the parent end up spending its time doing,
particularly if the child thread takes a long time to complete?)
Now run helgrind on this program.
Now look at a slightly modified version of the code, which is found in
main-signal-cv.c. This version uses a condition variable to do the
signaling (and associated lock).
Once again run helgrind on main-signal-cv. Does it report any errors?