open_toontown_panda3d/panda/src/express/test_threaddata.cxx

91 lines
2.3 KiB
C++

// Filename: test_threaddata.cxx
// Created by: cary (16Sep98)
//
////////////////////////////////////////////////////////////////////
//
// PANDA 3D SOFTWARE
// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved
//
// All use of this software is subject to the terms of the Panda 3d
// Software license. You should have received a copy of this license
// along with this source code; you will also find a current copy of
// the license at http://etc.cmu.edu/panda3d/docs/license/ .
//
// To contact the maintainers of this program write to
// panda3d-general@lists.sourceforge.net .
//
////////////////////////////////////////////////////////////////////
#include "pandabase.h"
#include "thread.h"
#include "pmutex.h"
#include "mutexHolder.h"
#include "pointerTo.h"
Mutex *cout_mutex = (Mutex *)NULL;
// Test forking a thread with some private data.
class ThreadWithData : public Thread {
public:
ThreadWithData(const string &name, int parameter);
virtual void thread_main();
private:
int _parameter;
};
ThreadWithData::
ThreadWithData(const string &name, int parameter) :
Thread(name),
_parameter(parameter)
{
MutexHolder holder(cout_mutex);
cout << "Creating thread " << get_name() << " with parameter " << _parameter
<< "\n";
}
void ThreadWithData::
thread_main() {
for (int i = 0; i < _parameter; i++) {
{
MutexHolder holder(cout_mutex);
cout << "Running thread " << get_name()
<< " with parameter " << _parameter
<< ", i = " << i << "\n" << flush;
Thread *thread = get_current_thread();
nassertv(thread == this);
}
Thread::sleep((double) i / 10.0);
}
}
int
main() {
cout << "main beginning.\n";
for (int i = 0; i < 10; i++) {
string name = string("thread_") + (char)(i + 'a');
PT(Thread) thread = new ThreadWithData(name, i);
if (!thread->start(TP_low, false, false)) {
MutexHolder holder(cout_mutex);
cout << "Unable to start " << name << ".\n";
} else {
MutexHolder holder(cout_mutex);
cout << "Started " << name << ", count = "
<< thread->get_ref_count() << "\n";
}
}
{
MutexHolder holder(cout_mutex);
cout << "main preparing to exit.\n";
}
Thread::prepare_for_exit();
cout << "main exiting.\n";
return 0;
}