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. Only one thread at a time can own a mutex object.
8 For example, when several thread use the data stored in the linked list,
9 modifications to the list should be only allowed to one thread at a time
10 because during a new node addition the list integrity is temporarily broken
11 (this is also called
{\it program invariant
}).
17 // this variable has an "s_" prefix because it is static: seeing an "s_" in
18 // a multithreaded program is in general a good sign that you should use a
19 // mutex (or a critical section)
20 static wxMutex *s_mutexProtectingTheGlobalData;
22 // we store some numbers in this global array which is presumably used by
23 // several threads simultaneously
26 void MyThread::AddNewNode(int num)
28 // ensure that no other thread accesses the list
29 s_mutexProtectingTheGlobalList->Lock();
33 s_mutexProtectingTheGlobalList->Unlock();
36 // return TRUE the given number is greater than all array elements
37 bool MyThread::IsGreater(int num)
39 // before using the list we must acquire the mutex
40 wxMutexLocker lock(s_mutexProtectingTheGlobalData);
42 size_t count = s_data.Count();
43 for ( size_t n =
0; n < count; n++ )
45 if ( s_data
[n
] > num )
54 Notice how wxMutexLocker was used in the second function to ensure that the
55 mutex is unlocked in any case: whether the function returns TRUE or FALSE
56 (because the destructor of the local object
{\it lock
} is always called). Using
57 this class instead of directly using wxMutex is, in general safer and is even
58 more so if yoor program uses C++ exceptions.
60 \wxheading{Derived from
}
64 \wxheading{Include files
}
70 \helpref{wxThread
}{wxthread
},
\helpref{wxCondition
}{wxcondition
},
71 \helpref{wxMutexLocker
}{wxmutexlocker
},
\helpref{wxCriticalSection
}{wxcriticalsection
}
73 \latexignore{\rtfignore{\wxheading{Members
}}}
75 \membersection{wxMutex::wxMutex
}\label{wxmutexconstr
}
77 \func{}{wxMutex
}{\void}
81 \membersection{wxMutex::
\destruct{wxMutex
}}
83 \func{}{\destruct{wxMutex
}}{\void}
85 Destroys the wxMutex object.
87 \membersection{wxMutex::IsLocked
}\label{wxmutexislocked
}
89 \constfunc{bool
}{IsLocked
}{\void}
91 Returns TRUE if the mutex is locked, FALSE otherwise.
93 \membersection{wxMutex::Lock
}\label{wxmutexlock
}
95 \func{wxMutexError
}{Lock
}{\void}
97 Locks the mutex object.
99 \wxheading{Return value
}
104 \begin{twocollist
}\itemsep=
0pt
105 \twocolitem{{\bf wxMUTEX
\_NO\_ERROR}}{There was no error.
}
106 \twocolitem{{\bf wxMUTEX
\_DEAD\_LOCK}}{A deadlock situation was detected.
}
107 \twocolitem{{\bf wxMUTEX
\_BUSY}}{The mutex is already locked by another thread.
}
110 \membersection{wxMutex::TryLock
}\label{wxmutextrylock
}
112 \func{wxMutexError
}{TryLock
}{\void}
114 Tries to lock the mutex object. If it can't, returns immediately with an error.
116 \wxheading{Return value
}
121 \begin{twocollist
}\itemsep=
0pt
122 \twocolitem{{\bf wxMUTEX
\_NO\_ERROR}}{There was no error.
}
123 \twocolitem{{\bf wxMUTEX
\_DEAD\_LOCK}}{A deadlock situation was detected.
}
124 \twocolitem{{\bf wxMUTEX
\_BUSY}}{The mutex is already locked by another thread.
}
127 \membersection{wxMutex::Unlock
}\label{wxmutexunlock
}
129 \func{wxMutexError
}{Unlock
}{\void}
131 Unlocks the mutex object.
133 \wxheading{Return value
}
138 \begin{twocollist
}\itemsep=
0pt
139 \twocolitem{{\bf wxMUTEX
\_NO\_ERROR}}{There was no error.
}
140 \twocolitem{{\bf wxMUTEX
\_DEAD\_LOCK}}{A deadlock situation was detected.
}
141 \twocolitem{{\bf wxMUTEX
\_BUSY}}{The mutex is already locked by another thread.
}
142 \twocolitem{{\bf wxMUTEX
\_UNLOCKED}}{The calling thread tries to unlock an unlocked mutex.
}