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 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{wxThread
}{wxthread
},
\helpref{wxCondition
}{wxcondition
},
92 \helpref{wxMutexLocker
}{wxmutexlocker
},
\helpref{wxCriticalSection
}{wxcriticalsection
}
94 \latexignore{\rtfignore{\wxheading{Members
}}}
96 \membersection{wxMutex::wxMutex
}\label{wxmutexctor
}
98 \func{}{wxMutex
}{\param{wxMutexType
}{type =
{\tt wxMUTEX
\_DEFAULT}}}
102 \membersection{wxMutex::
\destruct{wxMutex
}}\label{wxmutexdtor
}
104 \func{}{\destruct{wxMutex
}}{\void}
106 Destroys the wxMutex object.
108 \membersection{wxMutex::Lock
}\label{wxmutexlock
}
110 \func{wxMutexError
}{Lock
}{\void}
112 Locks the mutex object.
114 \wxheading{Return value
}
119 \begin{twocollist
}\itemsep=
0pt
120 \twocolitem{{\bf wxMUTEX
\_NO\_ERROR}}{There was no error.
}
121 \twocolitem{{\bf wxMUTEX
\_DEAD\_LOCK}}{A deadlock situation was detected.
}
122 \twocolitem{{\bf wxMUTEX
\_BUSY}}{The mutex is already locked by another thread.
}
125 \membersection{wxMutex::TryLock
}\label{wxmutextrylock
}
127 \func{wxMutexError
}{TryLock
}{\void}
129 Tries to lock the mutex object. If it can't, returns immediately with an error.
131 \wxheading{Return value
}
136 \begin{twocollist
}\itemsep=
0pt
137 \twocolitem{{\bf wxMUTEX
\_NO\_ERROR}}{There was no error.
}
138 \twocolitem{{\bf wxMUTEX
\_DEAD\_LOCK}}{A deadlock situation was detected.
}
139 \twocolitem{{\bf wxMUTEX
\_BUSY}}{The mutex is already locked by another thread.
}
142 \membersection{wxMutex::Unlock
}\label{wxmutexunlock
}
144 \func{wxMutexError
}{Unlock
}{\void}
146 Unlocks the mutex object.
148 \wxheading{Return value
}
153 \begin{twocollist
}\itemsep=
0pt
154 \twocolitem{{\bf wxMUTEX
\_NO\_ERROR}}{There was no error.
}
155 \twocolitem{{\bf wxMUTEX
\_DEAD\_LOCK}}{A deadlock situation was detected.
}
156 \twocolitem{{\bf wxMUTEX
\_BUSY}}{The mutex is already locked by another thread.
}
157 \twocolitem{{\bf wxMUTEX
\_UNLOCKED}}{The calling thread tries to unlock an unlocked mutex.
}