Memory model
We need a more systematic and rigorous way to describe the interaction of threads through memory, their use of the shared data, and its effect on concurrent applications. This description is known as the memory model. The memory model describes what guarantees and restrictions exist when threads access the same memory location.
Prior to the C++11 standard, the C++ language had no memory model at all (the word thread was not mentioned in the standard). Why is that a problem? Consider our producer-consumer example again (let us focus on the producer side):
std::mutex mN; size_t N = 0; … new (buffer + N) T( … arguments … ); { // Critical section start – acquire lock std::lock_guard l(mN); ++N; } // Critical section end - release lock
The lock_guard
is just an RAII wrapper around the mutex, so we can't forget to unlock it, so the code boils down to this:
std::mutex mN;...