r6.1.1:LFDS611_BARRIER_COMPILER_READ
Source File
/liblfds611/inc/liblfds611.h
Define
#define LFDS611_BARRIER_COMPILER_READ [compiler read compiler barrier directive]
Parameters
No parameters.
Return Value
No return value.
Notes
Compilers typically are able to re-order the flow of instructions, where this re-ordering is only guaranteed to be valid within the context of a single thread; e.g. if thread A performs an operation and then raises a flag, where thread B is waiting on the flag, the compiler will in its re-ordering only take into account that the behaviour of the thread being re-ordered remains valid, such that in this case we might see in thread A the flag being raised before the operation is performed, since the compiler isn't taking into account that thread B is written on the assumption the flag will be raised after the operation.
Compilers typically offer a directive which acts as a read compiler barrier, where a read compiler barrier the prevents the compiler re-ordering both load operations below the barrier above the barrier and prevents the compiler re-ordering load operations above the barrier to below the barrier.
Examples
Under MSVC, there is a compiler intrinsic _ReadBarrier(), which has the following prototype;
void _ReadBarrier(void);
As such, the implementation of LFDS611_BARRIER_COMPILER_READ on MSVC looks like this;
#define LFDS611_BARRIER_PROCESSOR_READ _ReadBarrier()
Note there is no trailing semi-colon. It is however harmless to have it in the #define.