1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- #ifndef _RNG_PARAQUEUE_POOL__HPP
- #define _RNG_PARAQUEUE_POOL__HPP
- // implement as singleton
- // start random number generator thread in constructor of singleton class
- // generate new RngQueues as requested
- // generate random numbers for all RngQueues
- #include <gsl/gsl_rng.h>
- #include <gsl/gsl_randist.h>
- #include <map>
- #include <deque>
- #include <QThread>
- #include <QWaitCondition>
- #include <QSemaphore>
- #include <QMutex>
- #include "i_rng_pool.hpp"
- /**
- @example rngthreadexample.cpp
- This is an example of how to use RngParaQueuePool.
- */
- /** @brief random number generator in a separate thread
- For an example of how to use this class see \ref rngthreadexample.cpp
- */
- class RngParaQueuePool: public QThread, public IRngQueuePool
- {
- class RngQueueInfo
- {
- public:
- RngQueueInfo(gsl_rng * _GslR, RngType Type, double Parameter, int NVectors, int NumbersPerVector);
- bool refreshRandomNumbers();
- vector<double>* getRandomNumberVector();
- vector<double>* getCurrentRandomNumberVector(); // only used in getRngQueue(...)
- int NUsedNumbers();
- private:
- gsl_rng * mGslR; // random number generator status
-
- int mNRndVectors;
- int mkNumbersPerVector;
- vector<vector<double> > mRNVectorPool;
-
- deque<int> mFreshNumbers; // indices in mRNVectorPool
- deque<int> mUsedNumbers; // indices in mRNVectorPool
- QMutex mMutFreshNumbers;
- QMutex mMutUsedNumbers;
-
- int mLeasedNumber;
- RngType mType;
- double mParameter;
- QMutex mMutex;
- QWaitCondition mNotEmpty;
-
- QSemaphore mSemFreshNumbers;
- };
- typedef map<IRngQueue*,RngQueueInfo*> QueInfoMap;
- typedef QueInfoMap::iterator IterQueInfoMap;
- public:
- static IRngQueuePool* getRngQueuePool();
- virtual IRngQueue* getRngQueue();
- virtual IRngQueue* getRngQueue(RngType _RType, double _Parameter, int NVectors=10, int NumbersPerVector=2000);
- virtual vector<double>* getRandomNumberVector(IRngQueue*);
- virtual void releaseRngQueue(IRngQueue*);
- void run();
- private:
- RngParaQueuePool();
- ~RngParaQueuePool();
- void refreshRandomNumbers(vector<double>& rnVect);
- void refillRNumberPool();
- // int mNUsedNumbers;
- gsl_rng * gslr; // random number generator status
-
- QueInfoMap mQueueInfoMap;
- QMutex mMutQueueInfoMap;
-
- // QMutex mNotFullMutex;
- // QWaitCondition mNotFull;
- QSemaphore mTotalUsedNumbers;
-
- bool mIsDead;
- };
- #endif // _RNG_PARAQUEUE_POOL__HPP
|