MEMBAR_OPS(3) | Library Functions Manual | MEMBAR_OPS(3) |
membar_ops
, membar_enter
,
membar_exit
, membar_producer
,
membar_consumer
,
membar_datadep_consumer
,
membar_sync
—
#include <sys/atomic.h>
void
membar_enter
(void);
void
membar_exit
(void);
void
membar_producer
(void);
void
membar_consumer
(void);
void
membar_datadep_consumer
(void);
void
membar_sync
(void);
membar_ops
family of functions provide memory access
barrier operations necessary for synchronization in multiprocessor execution
environments that have relaxed load and store order.
membar_enter
()membar_enter
() will reach
global visibility before all loads and stores following it.
membar_enter
() is typically used in
code that implements locking primitives to ensure that a lock protects
its data.
membar_exit
()membar_exit
() will
reach global visibility before any store that follows it.
membar_exit
() is typically used in
code that implements locking primitives to ensure that a lock protects
its data.
membar_producer
()membar_consumer
()membar_datadep_consumer
()membar_consumer
(), but limited to loads of
addresses dependent on prior loads, or ‘data-dependent’
loads:
int **pp, *p, v; p = *pp; membar_datadep_consumer(); v = *p; consume(v);
Does not guarantee ordering of loads in branches, or
‘control-dependent’ loads -- you must use
membar_consumer
() instead:
int *ok, *p, v; if (*ok) { membar_consumer(); v = *p; consume(v); }
Most CPUs do not reorder data-dependent loads (i.e., most CPUs
guarantee that cached values are not stale in that case), so
membar_datadep_consumer
() is a no-op on those
CPUs.
membar_sync
()membar_ops
functions first appeared in
NetBSD 5.0. The data-dependent load barrier,
membar_datadep_consumer
(), first appeared in
NetBSD 7.0.
November 20, 2014 | NetBSD 9.0 |