rng_paraqueue_pool.hpp 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #ifndef _RNG_PARAQUEUE_POOL__HPP
  2. #define _RNG_PARAQUEUE_POOL__HPP
  3. // implement as singleton
  4. // start random number generator thread in constructor of singleton class
  5. // generate new RngQueues as requested
  6. // generate random numbers for all RngQueues
  7. #include <gsl/gsl_rng.h>
  8. #include <gsl/gsl_randist.h>
  9. #include <map>
  10. #include <deque>
  11. #include <QThread>
  12. #include <QWaitCondition>
  13. #include <QSemaphore>
  14. #include <QMutex>
  15. #include "i_rng_pool.hpp"
  16. /**
  17. @example rngthreadexample.cpp
  18. This is an example of how to use RngParaQueuePool.
  19. */
  20. /** @brief random number generator in a separate thread
  21. For an example of how to use this class see \ref rngthreadexample.cpp
  22. */
  23. class RngParaQueuePool: public QThread, public IRngQueuePool
  24. {
  25. class RngQueueInfo
  26. {
  27. public:
  28. RngQueueInfo(gsl_rng * _GslR, RngType Type, double Parameter, int NVectors, int NumbersPerVector);
  29. bool refreshRandomNumbers();
  30. vector<double>* getRandomNumberVector();
  31. vector<double>* getCurrentRandomNumberVector(); // only used in getRngQueue(...)
  32. int NUsedNumbers();
  33. private:
  34. gsl_rng * mGslR; // random number generator status
  35. int mNRndVectors;
  36. int mkNumbersPerVector;
  37. vector<vector<double> > mRNVectorPool;
  38. deque<int> mFreshNumbers; // indices in mRNVectorPool
  39. deque<int> mUsedNumbers; // indices in mRNVectorPool
  40. QMutex mMutFreshNumbers;
  41. QMutex mMutUsedNumbers;
  42. int mLeasedNumber;
  43. RngType mType;
  44. double mParameter;
  45. QMutex mMutex;
  46. QWaitCondition mNotEmpty;
  47. QSemaphore mSemFreshNumbers;
  48. };
  49. typedef map<IRngQueue*,RngQueueInfo*> QueInfoMap;
  50. typedef QueInfoMap::iterator IterQueInfoMap;
  51. public:
  52. static IRngQueuePool* getRngQueuePool();
  53. virtual IRngQueue* getRngQueue();
  54. virtual IRngQueue* getRngQueue(RngType _RType, double _Parameter, int NVectors=10, int NumbersPerVector=2000);
  55. virtual vector<double>* getRandomNumberVector(IRngQueue*);
  56. virtual void releaseRngQueue(IRngQueue*);
  57. void run();
  58. private:
  59. RngParaQueuePool();
  60. ~RngParaQueuePool();
  61. void refreshRandomNumbers(vector<double>& rnVect);
  62. void refillRNumberPool();
  63. // int mNUsedNumbers;
  64. gsl_rng * gslr; // random number generator status
  65. QueInfoMap mQueueInfoMap;
  66. QMutex mMutQueueInfoMap;
  67. // QMutex mNotFullMutex;
  68. // QWaitCondition mNotFull;
  69. QSemaphore mTotalUsedNumbers;
  70. bool mIsDead;
  71. };
  72. #endif // _RNG_PARAQUEUE_POOL__HPP