Given the following sample that intends to wait until another thread stores 42
in a shared variable shared
without locks and without waiting for thread termination, why would volatile T
or std::atomic<T>
be required or recommended to guarantee concurrency correctness?
#include <atomic>
#include <cassert>
#include <cstdint>
#include <thread>
int main()
{
int64_t shared = 0;
std::thread thread([&shared]() {
shared = 42;
});
while (shared != 42) {
}
assert(shared == 42);
thread.join();
return 0;
}
With GCC 4.8.5 and default options, the sample works as expected.
Aucun commentaire:
Enregistrer un commentaire