
On Fri, 09 Jan 2009 03:48:05 -0600, Michael Marcin <mike.marcin@gmail.com> wrote:
For one thing this is yet another case where I used a default constructor on a uuid during natural coding and expected it to be cheap but I digress.
Do I have to protect the shared generator with a mutex? Should I even be using a shared generator or should I be constructing it on the stack in this function? I don't expect this to be called very often (twice total in our current application) but I want to make sure it is bullet proof since it can potentially be called concurrently.
A PRNG is stateful, hence concurrent access lead need to be protected, but your mutex needs to be static, of course. I just had exactly the same need and I did protect it with a mutex. You will probably also have the need to do a "init once" for your PRNG. I did something like this for the init : static boost::hellekalek1995 rng; static boost::mutex mutex; static volatile bool initialized = false; if (!initialized) { // double checking pattern boost::lock_guard<boost::mutex> lock(mutex); if (!initialized) { // do the init rng.seed(blah blah blah); initialized = true; } } -- EA