Overview | Group | Tree | Graph | Index | Concepts |
The class IloFastMutex
provides synchronization primitives adapted to
the needs of Concert Technology. In particular, an instance of the class
IloFastMutex
is a non-recursive mutex that implements mutual exclusion
from critical sections of code in multithreaded applications. The purpose of a mutex
is to guarantee that concurrent calls to a critical section of code in a multithreaded
application are serialized. If a critical section of code is protected by a mutex,
then two (or more) threads cannot execute the critical section simultaneously. That is,
an instance of this class makes it possible for you to serialize potentially concurrent
calls.
Concert Technology implements a mutex by using a single resource that you lock when your application enters the critical section and that you unlock when you leave. Only one thread can own that resource at a given time.
See ILOUSEMT
for details about the compilation
macro to use with instances of this class.
Protection by a Mutex
A critical section of code in a multithreaded application is protected by a mutex
when that section of code is encapsulated by a pair of calls to the member functions
IloFastMutex::lock
and
IloFastMutex::unlock
.
In fact, we say that a pair of calls to the member functions lock
and
unlock
defines a critical section. The conventional way of defining a
critical section looks like this:
mutex.lock(); while (conditionC does not hold) condition.wait(&mutex); doTreatmentT(); mutex.unlock();
The class IloCondition
provides synchronization
primitives to express conditions in critical sections of code.
State of a Mutex
A mutex (an instance of IloFastMutex
) has a state; the state may be
locked or unlocked. You can inquire about the state of a mutex to determine whether
it is locked or unlocked by using the member function
IloFastMutex::isLocked
. When a thread enters a critical
section of code in a multithreaded application and then locks the mutex defining that
critical section, we say that the thread owns that lock and that lock belongs to the
thread until the thread unlocks the mutex.
Exceptions
The member functions IloFastMutex::lock
and
IloFastMutex::unlock
can throw C++ exceptions when exceptions are
enabled on platforms that support them. These are the possible exceptions:
IloMutexDeadlock
: Instances of IloFastMutex
are not
recursive. Consequently, if a thread locks a mutex and then attempts to lock that
mutex again, the member function lock
throws the exception
MutexDeadlock
. On platforms that do not support exceptions, it causes the
application to exit.IloMutexNotOwner
: The thread that releases a given lock (that is, the
thread that unlocks a mutex) must be the same thread that locked the mutex in the first
place. For example, if a thread A
takes lock L
and thread
B
attempts to unlock L
, then the member function
unlock
throws the exception MutexNotOwner
. On platforms that
do not support exceptions, it causes the application to exit.IloMutexNotOwner
: The member function unlock
throws this
exception whenever a thread attempts to unlock an instance of IloFastMutex
that is not already locked. On platforms that do not support exceptions, it causes the
application to exit.System Class: Memory Management
IloFastMutex
is a system class.
Most Concert Technology classes are actually handle classes whose instances point
to objects of a corresponding implementation class. For example, instances of the
Concert Technology class IloNumVar
are handles pointing to instances of
the implementation class IloNumVarI
. Their allocation and de-allocation
in internal data structures of Concert Technology are managed by an instance of
IloEnv
.
However, system classes, such as IloFastMutex
, differ from that
pattern. IloFastMutex
is an ordinary C++ class. Its instances are
allocated on the C++ heap.
Instances of IloFastMutex
are not automatically de-allocated by a call
to IloEnv::end
. You must explicitly destroy instances
of IloFastMutex
by means of a call to the delete operator (which calls
the appropriate destructor) when your application no longer needs instances of this
class.
Furthermore, you should not allocate—neither directly nor indirectly—any
instance of IloFastMutex
in the Concert Technology environment because
the destructor for that instance of IloFastMutex
will never be called
automatically by IloEnv::end
when it cleans up other
Concert Technology objects in the Concert Technology environment. In other words,
allocation of any instance of IloFastMutex
in the Concert Technology
environment will produce memory leaks.
For example, it is not a good idea to make an instance of IloFastMutex
part of a conventional Concert Technology model allocated in the Concert Technology
environment because that instance will not automatically be de-allocated from the
Concert Technology environment along with the other Concert Technology objects.
De-allocating Instances of IloFastMutex
Instances of IloFastMutex
differ from the usual Concert Technology
objects because they are not allocated in the Concert Technology environment, and
their de-allocation is not managed automatically for you by
IloEnv::end
. Instead, you must explicitly destroy
instances of IloFastMutex
by calling the delete operator when your
application no longer needs those objects.
See Also:
IloBarrier, IloCondition, ILOUSEMT
Constructor and Destructor Summary | |
---|---|
public | IloFastMutex() |
public | ~IloFastMutex() |
Method Summary | |
---|---|
public int | isLocked() |
public void | lock() |
public void | unlock() |
Constructor and Destructor Detail |
---|
This constructor creates an instance of IloFastMutex
and allocates it
on the C++ heap (not in the Concert Technology environment). This mutex contains
operating system-specific resources to represent a lock. You may use this mutex for
purposes that are private to a process. Its behavior is undefined for inter-process
locking.
The delete operator calls this destructor to de-allocate an instance of
IloFastMutex
. This destructor is called automatically by the runtime
system. The destructor releases operating system-specific resources of the invoking
mutex.
Method Detail |
---|
This member function returns a Boolean value that indicates the state of the
invoking mutex. That is, it tells you whether the mutex is locked by the calling
thread (0
) or unlocked (1
) or locked by a thread other
than the calling thread (also 1
).
This member function acquires a lock for the invoking mutex on behalf of the
calling thread. That lock belongs to the calling thread until the member function
unlock
is called.
If you call this member function and the invoking mutex has already been locked, then the calling thread is suspended until the first lock is released.
This member function releases the lock on the invoking mutex, if there is such a lock.
If you call this member function on a mutex that has not been locked, then this member function throws an exception if C++ exceptions have been enabled on a platform that supports exceptions. Otherwise, it causes the application to exit.