hi
i have a problem with monitor class at windows. I made a queue with monitor class, use notify() in put and timedwait() in get. when i have several(>20) thread to get and 1 thread to put, the thread will block. i pause the program , found one of the get thread blocked at _gate.wait() of prewait(), and another get thread blocked at _queue.wait() of postwait().
these is my test code
Code:
#include <IceUtil/Thread.h>
#include <IceUtil/Time.h>
#include <IceUtil/Monitor.h>
#include <Ice/Ice.h>
#include <iostream>
#include <list>
template<class t> class Queue: public IceUtil::Monitor<IceUtil::Mutex>
{
public:
Queue(){};
void put(const t & item) {
IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this);
_q.push_back(item);
notify();
}
bool timedGet( t & ret, const IceUtil::Time& timeout)
{
IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this);
if (_q.size() == 0)
timedWait(timeout);
if (_q.size() == 0)
{
return false;
}
ret = _q.front();
_q.pop_front();
return true;
}
private:
std::list<t> _q;
};
Queue<int> m_pQ;
class testthread : public IceUtil::Thread
{
public:
virtual void run()
{
int n = 0;
srand((int)IceUtil::Time::now().toMicroSeconds());
while(true)
{
int Result;
int nTime = rand() % 1000;
m_pQ.timedGet(Result, IceUtil::Time::microSeconds(nTime) );
Sleep(10);
std::cout << nTime << " ";
}
}
};
void main()
{
for (int i = 0; i < 100; i++)
{
testthread* p = new testthread;
p->start();
}
while(true)
{
m_pQ.put(2);
Sleep(1);
}
return;
}