// // C++ Implementation: rng_queue_pool // // Description: // // // Author: Frank Michler,,, , (C) 2010 // // Copyright: See COPYING file that comes with this distribution // // #include #include #include #include #include "rng_queue_pool.hpp" #include "rngqueue.hpp" using namespace std; RngQueuePool::RngQueuePool(): mSemFreshNumbers(0), mSemUsedNumbers(mNRndVectors), mIsDead(false) { cout << "Singleton-Constructor: RngQueuePool::RngQueuePool()\n"; // initialize global random generator const gsl_rng_type * T; gsl_rng_env_setup(); T = gsl_rng_default; gslr = gsl_rng_alloc (T); #ifdef SEED_RNG_WITH_42 unsigned long int seed = (long)(42); #else unsigned long int seed = (long)(time( NULL )); #endif gsl_rng_set(gslr, seed); mRNVectorPool = vector >(mNRndVectors, vector(mkNumbersPerVector, 0)); for (int i=0; i* RngQueuePool::getRandomNumberVector(IRngQueue* _RngQueue) { map::iterator it = mLeasedNumbers.find(_RngQueue); if (it!=mLeasedNumbers.end()) { if (!mSemFreshNumbers.tryAcquire()) { //cout << "getRandomNumberVector waiting for fresh numbers\n"; //cout << "-"; mSemFreshNumbers.acquire(); } mMutFreshNumbers.lock(); int FreshVectorNum = mFreshNumbers.front(); mFreshNumbers.pop_front(); mMutFreshNumbers.unlock(); mMutUsedNumbers.lock(); mUsedNumbers.push_back((*it).second); mMutUsedNumbers.unlock(); (*it).second = FreshVectorNum; mSemUsedNumbers.release(); // cout << "leased fresh Vector Num=" << FreshVectorNum << "\n"; return &(mRNVectorPool[FreshVectorNum]); } cout << "RngQueuePool::getRandomNumberVector failed\n"; return 0; } void RngQueuePool::refreshRandomNumbers(vector& rnVect) { // cout << "RngQueuePool::refreshRandomNumbers\n"; const double PoissonLambda=0.3; for(vector::iterator it=rnVect.begin();it!=rnVect.end();++it) { (*it) = gsl_ran_poisson(gslr, PoissonLambda); } } void RngQueuePool::refillRNumberPool() { while (!mIsDead) { if (!mSemUsedNumbers.tryAcquire()) { // cout << "\nRngQueuePool::refillRNumberPool waiting for used numbers\n"; //cout << "+"; mSemUsedNumbers.acquire(); } mMutUsedNumbers.lock(); int VectorNum = mUsedNumbers.front(); mUsedNumbers.pop_front(); mMutUsedNumbers.unlock(); refreshRandomNumbers(mRNVectorPool[VectorNum]); mMutFreshNumbers.lock(); mFreshNumbers.push_back(VectorNum); mMutFreshNumbers.unlock(); mSemFreshNumbers.release(); } cout << "finish thread loop \n"; } void RngQueuePool::run() { refillRNumberPool(); }