Archived
This forum has been archived. Please start a new discussion on GitHub.
monitor util thread block at windows system
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
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
#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; }
0
Comments
-
Thanks for the problem report. We're looking into the problem.0
-
BTW, can you fix the name in your profile please? You are required to give your full real name in your profile for free support on these forums.0
-
ok, i have changed:D0
-
Thanks for the bug report and test case. I've posted a patch that fixes this problem. Please see http://www.zeroc.com/forums/patches/3203-patch-3-ice-3-2-fix-condition-variable-implementation-under-windows.html#post14113 for details.0