1998-06-14 12:11:50 +00:00
|
|
|
\section{\class{wxMutex}}\label{wxmutex}
|
|
|
|
|
1999-01-02 23:02:30 +00:00
|
|
|
A mutex object is a synchronization object whose state is set to signaled when
|
|
|
|
it is not owned by any thread, and nonsignaled when it is owned. Its name comes
|
|
|
|
from its usefulness in coordinating mutually-exclusive access to a shared
|
2001-04-08 22:49:09 +00:00
|
|
|
resource. Only one thread at a time can own a mutex object but the mutexes are
|
|
|
|
recursive in the sense that a thread can lock a mutex which it had already
|
|
|
|
locked before (instead of dead locking the entire process in this situation by
|
|
|
|
starting to wait on a mutex which will never be released while the thread is
|
|
|
|
waiting).
|
1999-01-02 23:02:30 +00:00
|
|
|
|
|
|
|
For example, when several thread use the data stored in the linked list,
|
|
|
|
modifications to the list should be only allowed to one thread at a time
|
|
|
|
because during a new node addition the list integrity is temporarily broken
|
|
|
|
(this is also called {\it program invariant}).
|
|
|
|
|
|
|
|
\wxheading{Example}
|
|
|
|
|
|
|
|
{\small%
|
|
|
|
\begin{verbatim}
|
|
|
|
// this variable has an "s_" prefix because it is static: seeing an "s_" in
|
|
|
|
// a multithreaded program is in general a good sign that you should use a
|
|
|
|
// mutex (or a critical section)
|
|
|
|
static wxMutex *s_mutexProtectingTheGlobalData;
|
|
|
|
|
|
|
|
// we store some numbers in this global array which is presumably used by
|
|
|
|
// several threads simultaneously
|
|
|
|
wxArrayInt s_data;
|
|
|
|
|
|
|
|
void MyThread::AddNewNode(int num)
|
|
|
|
{
|
|
|
|
// ensure that no other thread accesses the list
|
|
|
|
s_mutexProtectingTheGlobalList->Lock();
|
|
|
|
|
|
|
|
s_data.Add(num);
|
|
|
|
|
|
|
|
s_mutexProtectingTheGlobalList->Unlock();
|
|
|
|
}
|
|
|
|
|
|
|
|
// return TRUE the given number is greater than all array elements
|
|
|
|
bool MyThread::IsGreater(int num)
|
|
|
|
{
|
|
|
|
// before using the list we must acquire the mutex
|
|
|
|
wxMutexLocker lock(s_mutexProtectingTheGlobalData);
|
|
|
|
|
|
|
|
size_t count = s_data.Count();
|
|
|
|
for ( size_t n = 0; n < count; n++ )
|
|
|
|
{
|
|
|
|
if ( s_data[n] > num )
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
\end{verbatim}
|
|
|
|
}
|
|
|
|
|
|
|
|
Notice how wxMutexLocker was used in the second function to ensure that the
|
|
|
|
mutex is unlocked in any case: whether the function returns TRUE or FALSE
|
|
|
|
(because the destructor of the local object {\it lock} is always called). Using
|
|
|
|
this class instead of directly using wxMutex is, in general safer and is even
|
2001-04-08 22:49:09 +00:00
|
|
|
more so if your program uses C++ exceptions.
|
1998-06-14 12:11:50 +00:00
|
|
|
|
|
|
|
\wxheading{Derived from}
|
|
|
|
|
|
|
|
None.
|
|
|
|
|
1999-02-15 20:41:29 +00:00
|
|
|
\wxheading{Include files}
|
|
|
|
|
|
|
|
<wx/thread.h>
|
|
|
|
|
1998-06-14 12:11:50 +00:00
|
|
|
\wxheading{See also}
|
|
|
|
|
2000-03-15 00:21:49 +00:00
|
|
|
\helpref{wxThread}{wxthread}, \helpref{wxCondition}{wxcondition},
|
1999-01-02 23:02:30 +00:00
|
|
|
\helpref{wxMutexLocker}{wxmutexlocker}, \helpref{wxCriticalSection}{wxcriticalsection}
|
1998-06-14 12:11:50 +00:00
|
|
|
|
|
|
|
\latexignore{\rtfignore{\wxheading{Members}}}
|
|
|
|
|
|
|
|
\membersection{wxMutex::wxMutex}\label{wxmutexconstr}
|
|
|
|
|
|
|
|
\func{}{wxMutex}{\void}
|
|
|
|
|
|
|
|
Default constructor.
|
|
|
|
|
|
|
|
\membersection{wxMutex::\destruct{wxMutex}}
|
|
|
|
|
|
|
|
\func{}{\destruct{wxMutex}}{\void}
|
|
|
|
|
|
|
|
Destroys the wxMutex object.
|
|
|
|
|
|
|
|
\membersection{wxMutex::IsLocked}\label{wxmutexislocked}
|
|
|
|
|
|
|
|
\constfunc{bool}{IsLocked}{\void}
|
|
|
|
|
|
|
|
Returns TRUE if the mutex is locked, FALSE otherwise.
|
|
|
|
|
|
|
|
\membersection{wxMutex::Lock}\label{wxmutexlock}
|
|
|
|
|
|
|
|
\func{wxMutexError}{Lock}{\void}
|
|
|
|
|
|
|
|
Locks the mutex object.
|
|
|
|
|
|
|
|
\wxheading{Return value}
|
|
|
|
|
|
|
|
One of:
|
|
|
|
|
|
|
|
\twocolwidtha{7cm}
|
|
|
|
\begin{twocollist}\itemsep=0pt
|
1999-01-02 23:02:30 +00:00
|
|
|
\twocolitem{{\bf wxMUTEX\_NO\_ERROR}}{There was no error.}
|
|
|
|
\twocolitem{{\bf wxMUTEX\_DEAD\_LOCK}}{A deadlock situation was detected.}
|
|
|
|
\twocolitem{{\bf wxMUTEX\_BUSY}}{The mutex is already locked by another thread.}
|
1998-06-14 12:11:50 +00:00
|
|
|
\end{twocollist}
|
|
|
|
|
|
|
|
\membersection{wxMutex::TryLock}\label{wxmutextrylock}
|
|
|
|
|
|
|
|
\func{wxMutexError}{TryLock}{\void}
|
|
|
|
|
|
|
|
Tries to lock the mutex object. If it can't, returns immediately with an error.
|
|
|
|
|
|
|
|
\wxheading{Return value}
|
|
|
|
|
|
|
|
One of:
|
|
|
|
|
|
|
|
\twocolwidtha{7cm}
|
|
|
|
\begin{twocollist}\itemsep=0pt
|
1999-01-02 23:02:30 +00:00
|
|
|
\twocolitem{{\bf wxMUTEX\_NO\_ERROR}}{There was no error.}
|
|
|
|
\twocolitem{{\bf wxMUTEX\_DEAD\_LOCK}}{A deadlock situation was detected.}
|
|
|
|
\twocolitem{{\bf wxMUTEX\_BUSY}}{The mutex is already locked by another thread.}
|
1998-06-14 12:11:50 +00:00
|
|
|
\end{twocollist}
|
|
|
|
|
|
|
|
\membersection{wxMutex::Unlock}\label{wxmutexunlock}
|
|
|
|
|
|
|
|
\func{wxMutexError}{Unlock}{\void}
|
|
|
|
|
|
|
|
Unlocks the mutex object.
|
|
|
|
|
|
|
|
\wxheading{Return value}
|
|
|
|
|
|
|
|
One of:
|
|
|
|
|
|
|
|
\twocolwidtha{7cm}
|
|
|
|
\begin{twocollist}\itemsep=0pt
|
1999-01-02 23:02:30 +00:00
|
|
|
\twocolitem{{\bf wxMUTEX\_NO\_ERROR}}{There was no error.}
|
|
|
|
\twocolitem{{\bf wxMUTEX\_DEAD\_LOCK}}{A deadlock situation was detected.}
|
|
|
|
\twocolitem{{\bf wxMUTEX\_BUSY}}{The mutex is already locked by another thread.}
|
|
|
|
\twocolitem{{\bf wxMUTEX\_UNLOCKED}}{The calling thread tries to unlock an unlocked mutex.}
|
1998-06-14 12:11:50 +00:00
|
|
|
\end{twocollist}
|
|
|
|
|