sequences of events are interrupted by other sequences of events that
destroy critical dependencies. Examples include the change of conditions
tested in one step and depended upon for the next step (e.g., checking for
the existence of a file before creating it interrupted by the creation of a
file of the same name by another owner), changes between one step in a
process and another step assuming that no such change has been made (e.g.,
the replacement of a mounted file system previously loaded with data in a
start-up process), and waiting for non-locked resources available in one
step but not in the next (e.g., the mounting of a different tape between an
initial read-through and a subsequent restoration).
conditions are not easy to detect. In general, they require at least
NP-complete time and space and may require factorial time in some cases.
Some automated analysis tools have been implemented to detect certain
classes of race conditions in source code and have shown promise.