corrected the completely wrong example (bug 545427)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15702 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2002-05-28 17:14:59 +00:00
parent d715d419e1
commit d30ff492f0

View File

@@ -22,10 +22,10 @@ This example shows how a main thread may launch a worker thread which starts
running and then waits until the main thread signals it to continue:
\begin{verbatim}
class MyWaitingThread : public wxThread
class MySignallingThread : public wxThread
{
public:
MyWaitingThread(wxMutex *mutex, wxCondition *condition)
MySignallingThread(wxMutex *mutex, wxCondition *condition)
{
m_mutex = mutex;
m_condition = condition;
@@ -35,19 +35,20 @@ public:
virtual ExitCode Entry()
{
// wait for the signal from the main thread: it is absolutely necessary
// to look the mutex before doing it!
m_mutex->Lock();
m_condition->Signal();
m_mutex->Unlock();
... do our job ...
// tell the other(s) thread(s) that we're about to terminate: we must
// lock the mutex first or we might signal the condition before the
// waiting threads start waiting on it!
wxMutexLocker lock(m_mutex);
m_condition.Broadcast(); // same as Signal() here -- one waiter only
return 0;
}
private:
wxCondition *m_condition;
wxMutex *m_mutex;
};
int main()
@@ -55,25 +56,29 @@ int main()
wxMutex mutex;
wxCondition condition(mutex);
for ( int i = 0; i < 10; i++ )
{
MyWaitingThread *thread = new MyWaitingThread(&mutex, &condition);
// the mutex should be initially locked
mutex.Lock();
thread->Run();
}
// create and run the thread but notice that it won't be able to
// exit (and signal its exit) before we unlock the mutex below
MySignallingThread *thread = new MySignallingThread(&mutex, &condition);
// wake up one of the threads
condition.Signal();
thread->Run();
// wake up all the other ones
condition.Broadcast();
... wait until they terminate or do something else ...
// wait for the thread termination: Wait() atomically unlocks the mutex
// which allows the thread to continue and starts waiting
condition.Wait();
// now we can exit
return 0;
}
\end{verbatim}
Of course, here it would be much better to simply use a joinable thread and
call \helpref{wxThread::Wait}{wxthreadwait} on it, but this example does
illustrate the importance of properly locking the mutex when using
wxCondition.
\wxheading{Derived from}
None.