1 \section{\class{wxMutex
}}\label{wxmutex
}
3 A mutex object is a synchronization object whose state is set to signaled when
4 it is not owned by any thread, and nonsignaled when it is owned. Its name comes
5 from its usefulness in coordinating mutually-exclusive access to a shared
6 resource as only one thread at a time can own a mutex object.
8 Mutexes may be recursive in the sense that a thread can lock a mutex which it
9 had already locked before (instead of dead locking the entire process in this
10 situation by starting to wait on a mutex which will never be released while the
11 thread is waiting) but using them is not recommended and they are
{\bf not
}
12 recursive by default. The reason for this is that recursive mutexes are not
13 supported by all Unix flavours and, worse, they cannot be used with
14 \helpref{wxCondition
}{wxcondition
}.
16 For example, when several threads use the data stored in the linked list,
17 modifications to the list should only be allowed to one thread at a time
18 because during a new node addition the list integrity is temporarily broken
19 (this is also called
{\it program invariant
}).
25 // this variable has an "s_" prefix because it is static: seeing an "s_" in
26 // a multithreaded program is in general a good sign that you should use a
27 // mutex (or a critical section)
28 static wxMutex *s_mutexProtectingTheGlobalData;
30 // we store some numbers in this global array which is presumably used by
31 // several threads simultaneously
34 void MyThread::AddNewNode(int num)
36 // ensure that no other thread accesses the list
37 s_mutexProtectingTheGlobalList->Lock();
41 s_mutexProtectingTheGlobalList->Unlock();
44 // return true if the given number is greater than all array elements
45 bool MyThread::IsGreater(int num)
47 // before using the list we must acquire the mutex
48 wxMutexLocker lock(s_mutexProtectingTheGlobalData);
50 size_t count = s_data.Count();
51 for ( size_t n =
0; n < count; n++ )
53 if ( s_data
[n
] > num )
62 Notice how wxMutexLocker was used in the second function to ensure that the
63 mutex is unlocked in any case: whether the function returns true or false
64 (because the destructor of the local object
{\it lock
} is always called). Using
65 this class instead of directly using wxMutex is, in general safer and is even
66 more so if your program uses C++ exceptions.
73 // normal mutex: try to always use this one
76 // recursive mutex: don't use these ones with wxCondition
81 \wxheading{Derived from
}
85 \wxheading{Include files
}
91 \helpref{wxBase
}{librarieslist
}
95 \helpref{wxThread
}{wxthread
},
\helpref{wxCondition
}{wxcondition
},
96 \helpref{wxMutexLocker
}{wxmutexlocker
},
\helpref{wxCriticalSection
}{wxcriticalsection
}
98 \latexignore{\rtfignore{\wxheading{Members
}}}
101 \membersection{wxMutex::wxMutex
}\label{wxmutexctor
}
103 \func{}{wxMutex
}{\param{wxMutexType
}{type =
{\tt wxMUTEX
\_DEFAULT}}}
108 \membersection{wxMutex::
\destruct{wxMutex
}}\label{wxmutexdtor
}
110 \func{}{\destruct{wxMutex
}}{\void}
112 Destroys the wxMutex object.
115 \membersection{wxMutex::Lock
}\label{wxmutexlock
}
117 \func{wxMutexError
}{Lock
}{\void}
119 Locks the mutex object. This is equivalent to
120 \helpref{LockTimeout
}{wxmutexlocktimeout
} with infinite timeout.
122 \wxheading{Return value
}
127 \begin{twocollist
}\itemsep=
0pt
128 \twocolitem{{\bf wxMUTEX
\_NO\_ERROR}}{There was no error.
}
129 \twocolitem{{\bf wxMUTEX
\_DEAD\_LOCK}}{A deadlock situation was detected.
}
133 \membersection{wxMutex::LockTimeout
}\label{wxmutexlocktimeout
}
135 \func{wxMutexError
}{LockTimeout
}{\param{unsigned long
}{ msec
}}
137 Try to lock the mutex object during the specified time interval.
139 \wxheading{Return value
}
144 \begin{twocollist
}\itemsep=
0pt
145 \twocolitem{{\bf wxMUTEX
\_NO\_ERROR}}{Mutex successfully locked.
}
146 \twocolitem{{\bf wxMUTEX
\_TIMEOUT}}{Mutex couldn't be acquired before timeout expiration.
}
147 \twocolitem{{\bf wxMUTEX
\_DEAD\_LOCK}}{A deadlock situation was detected.
}
151 \membersection{wxMutex::TryLock
}\label{wxmutextrylock
}
153 \func{wxMutexError
}{TryLock
}{\void}
155 Tries to lock the mutex object. If it can't, returns immediately with an error.
157 \wxheading{Return value
}
162 \begin{twocollist
}\itemsep=
0pt
163 \twocolitem{{\bf wxMUTEX
\_NO\_ERROR}}{There was no error.
}
164 \twocolitem{{\bf wxMUTEX
\_BUSY}}{The mutex is already locked by another thread.
}
168 \membersection{wxMutex::Unlock
}\label{wxmutexunlock
}
170 \func{wxMutexError
}{Unlock
}{\void}
172 Unlocks the mutex object.
174 \wxheading{Return value
}
179 \begin{twocollist
}\itemsep=
0pt
180 \twocolitem{{\bf wxMUTEX
\_NO\_ERROR}}{There was no error.
}
181 \twocolitem{{\bf wxMUTEX
\_UNLOCKED}}{The calling thread doesn't own the mutex.
}