IPC issues
Since all the threads in a process have unhindered access to
the shared data space, wouldn't this execution model
trivially
solve all of our IPC problems? Can't
we just communicate the data through shared memory and
dispense with any other execution models and IPC mechanisms?
If only it were that simple!
One issue is that the access of individual threads to common
data must be synchronized. Having one thread read
inconsistent data because another thread is part way through
modifying it is a recipe for disaster. For example, if one
thread is updating a linked list, no other threads can be
allowed to traverse or modify the list until the first
thread has finished. A code passage that must execute
serially
(i.e., by only one thread at a time)
in this manner is termed a critical section.
The program would fail (intermittently, depending on how
frequently a collision
occurred) with
irreparably damaged links unless some synchronization
mechanism ensured serial access.
Mutexes, semaphores, and condvars are examples of synchronization tools that can be used to address this problem. These tools are described later in this section.
Although synchronization services can be used to allow threads to cooperate, shared memory per se can't address a number of IPC issues. For example, although threads can communicate through the common data space, this works only if all the threads communicating are within a single process. What if our application needs to communicate a query to a database server? We need to pass the details of our query to the database server, but the thread we need to communicate with lies within a database server process and the address space of that server isn't addressable to us.