Revision with unchanged content. Multi-threaded programs are becoming more common in order to exploit the additional processing power provided by modern computer systems. Unfortunately, parallel programming is difficult to get right. Program execution becomes non-deterministic and new types of faults arise. A substantial source of errors are data races, where the program state may become undefined due to concurrent accesses to shared memory locations. Data races are difficult to find, because the observed faulty behavior is often not directly related to the program location causing the fault. The author presents improvements on the runtime analysis of C++ programs based on the Eraser algorithm that lead to a drastic reduction of false warnings. This is achieved by taking the temporally ordering characteristic of operations on condition variables into account. The author has validated the method by applying it to industrial size C++ programs. He compares the runtime behavior and the memory requirement of the method to commercial tools. The results confirm that the method presented in this book is faster and needs less memory for moderate numbers of threads, while the fault detection ratio is comparable.