34 const size_t g_sleeptime = 2;
35 const size_t g_multTasks = 10;
38 enum EProc {start, clean};
40 class TTestTask:
public TThreadPoolTaskImp<TTestTask, EProc> {
42 bool runTask(EProc ) {
43 m_tid = TThread::SelfId();
44 TThread::Sleep(g_sleeptime, 0L);
47 unsigned long threadID()
const {
54 ostream &operator<< (ostream &_stream,
const TTestTask &_task)
56 _stream << _task.threadID();
61 void stressThreadPool(
size_t _numThreads = 5,
bool _needDbg =
false)
63 size_t numTasks(_numThreads * g_multTasks);
64 TThreadPool<TTestTask, EProc> threadPool(_numThreads, _needDbg);
65 vector <TTestTask> tasksList(numTasks);
68 for (
size_t j = 0; j < 4; ++j )
70 cout <<
"+++++++++ Starting iteration #" << j <<
" ++++++++++++"<< endl;
71 for (
size_t i = 0; i < numTasks; ++i) {
72 threadPool.PushTask(tasksList[i], start);
75 cout <<
"\n ****** Drain the tasks queue ******" << endl;
78 cout <<
"\n Stopping..." << endl;
79 threadPool.Stop(
true);
85 typedef map<unsigned long, size_t> counter_t;
88 vector <TTestTask>::const_iterator iter = tasksList.begin();
89 vector <TTestTask>::const_iterator iter_end = tasksList.end();
90 for (; iter != iter_end; ++iter) {
91 counter_t::iterator found = counter.find(iter->threadID());
92 if (found == counter.end())
93 counter.insert(counter_t::value_type(iter->threadID(), 1));
95 found->second = found->second + 1;
100 cout <<
"\n************* RESULT ****************" << endl;
102 counter_t::const_iterator iter = counter.begin();
103 counter_t::const_iterator iter_end = counter.end();
105 for (; iter != iter_end; ++iter) {
106 cout <<
"Thread " << iter->first <<
" was used " << iter->second <<
" times\n";
109 if (iter->second != g_multTasks)
113 cout <<
"ThreadPool: the simple test status: " << (testOK ?
"OK" :
"Failed") << endl;