now writing complicated class
and felt that I use to much CRITICAL_SECTION
.
As far as I know there are atomic operations for some types, th
You cannot guarantee for all implementations/platforms/compilers that bool,
or any other type, or most operations, are atomic. So, no, I don't believe your statements are correct. You can retool your logic or use other means of establishing atomicity, but you probably can't get away with just removing CRITICAL_SECTION
usage if you rely on it.
Note: This answer applies to Windows and says nothing of other platforms.
There are no InterlockedRead or InterlockedWrite functions; simple reads and writes with the correct integer size (and alignment) are atomic on Windows ("Simple reads and writes to properly-aligned 32-bit variables are atomic operations.").
(and there are no cache problems since a properly-aligned variable is always on a single cache line).
However, reading and modifying such variables (or any other variable) are not atomic:
bool
? Fine. Test-And-Set a bool
? Better use
InterlockedCompareExchange.Here this can be found:
Simple reads and writes to properly aligned 64-bit variables are atomic on 64-bit Windows. Reads and writes to 64-bit values are not guaranteed to be atomic on 32-bit Windows. Reads and writes to variables of other sizes are not guaranteed to be atomic on any platform.
Result should be correct but in programming it is better not to trust should. There still remains small possibility of failure because of CPU cache.
std::atomic
has a is_lock_free
function.bool
may not be atomic. See here and here