#include <SyncGuard.h>
class SyncGuard {SyncGuard()();
SyncGuard(Synchronizable& syncer);
SyncGuard(Synchronizable& syncer, bool tryonly);
virtual ~SyncGuard();
dshwrapthread_t getOwner();
}
Macros: #define sync_self #define sync_begin(s) #define sync_begin2(t,s) #define sync_end #define sync_trybegin(s) #define sync_trybegin2(t,s) #define sync_tryend #define sync_global_begin(t) #define sync_global_end
The
SyncGuard
class uses a
Synchronizable
object to create
a critical region, or monitor. Both of these synchronization
primitives are mechanisms that ensure that only one thread can
execute a guarded code segment at a time.
Creating a
SynchGuard
on a synchronizable object locks the guard. Destroying the
object releases the guard. You can create more than one
SyncGuard
on a single
Synchronizable
object, and typically will.
The simplest use of
SynchGuard
is via its macros.
The NSCLDAQ threading system creates a global
Synchronizable
object that is used by all of the locking macros and constructors that
don't take an explicit parameter.
SyncGuard()();
Constructs a synchronization guard that uses the global
Syncrhonizable
to perform
the synchronization.
SyncGuard(Synchronizable& syncer);
Creates a
SyncGuard
that uses syncer
as its synchronization object.
SyncGuard(Synchronizable& syncer, bool tryonly);
Same as above, however if tryonly
is
true, and syncer
is already locked, the thread continues
execution.
virtual ~SyncGuard();
Destroys the guard, releasing the synchronization object.
dshwrapthread_t getOwner();
Returns the id of the thread that owns the synchronization object used by a synchronization guard. One use of this is to do a tryonly creation and then check to see if the running thread owns the object (indicating the try succeeded).
Macros . The macros below simplify the creation of critical segments of code.
This macro is intended for use within an object that is
derived from a
Synchronizable
. It locks the
current object.
Starts a a critical region that uses
s
to synchronize access.
Same as sync_begin
but
t
is appended to the name of the temporary
Syncrhonizable
the macro creates.
Marks the end of a critical section that was begun with one of the sync macros above.
This macro creates a temporary
SynchGuard
object constructed on
s
.
Non-blocking access is to the guard is attempted. If successful,
the code that follows the macro up until the next
sync_tryend
macro invocation is executed.
If access to the guard could not be gotten without blocking, the
code will not be executed.
This macro behaves the same as
sync_trybegin2
, however the parameter
t
is used to construct the name of the
SyncGuard
object used by the macro.
Marks the end of a block of code that was synchronized using the
sync_trybegin*
macros.
The NSCLDAQ thread synchronization library creates a global
Synchronizable
object. This can do process wide synchronization on a coarse grained
level.
sync_global_begin
constructs a
temporary
SyncGuard
on that object and locks it.
The t
paramter is used to construct the name
of the guard object.
Destroys the
SyncGuard
created by lexically most recent
sync_global_begin
macro. This releases the
synchronization object for other threads.