Concurrent programming deals with the problem of synchronizing and controlling more or less independent tasks that use common resources. Typical examples are the readers/writers problem and producer-consumer couplings. Good textbooks in this area are virtually nonexistent, so any attempt at filling this gap is welcome. Unfortunately, Schiper’s book is not the one we are waiting for. It is too informal and relies too heavily on pictures and implementation details to be used as a textbook for a serious computer science course.
The book introduces concurrent programming by describing a terminal interface for the PDP-11. This gives the author the opportunity to discuss such concepts as processes, interrupts, and mutual exclusion. Next he addresses the question of how to formulate concurrent processes in a program notation. Schiper does this in a number of ways: with shared variables and busy waiting, with interrupt masking, with locks, and with semaphores. He prefers to use semaphores but considers them inferior to monitors, the next synchronization mechanism introduced. His judgment in this is, however, based on the fact that he does not use the split binary semaphore [1], which would easily solve the problems for which he prefers monitors.
The monitor is the synchronization mechanism of PORTAL, the programming language in which most of the programs in the book are written. The author also provides short introductions to Modula-2 and to Ada’s rendezvous mechanism. The book concludes with the design of a chronometer and gives programs for it in all three languages.
All programs are presented informally, often by trial and error. The design does not start with a precise specification but with a purported solution. The author then shows that this solution can exhibit some erroneous behavior and changes the program to remedy that and obtain the next solution. Timing diagrams are sometimes used, but not invariants or proofs. Programs are never derived from specifications. All developments in the science of programming seem to have passed the author by completely.
On the positive side, the book has well-chosen exercises and many worked-out programs. These features do not, however, outweigh its defects. I cannot recommend this book as a textbook, and I am still waiting for a good text on concurrent programming.