Bonjour,
J'utilise boost::mt19937 comme RNG.
Avant de multithreader mon code je l'avait mis dans un singleton pour le seeder une seule fois pour toutes.
Code :
- class RandomGenerator : public boost::mt19937{
- static ml::RandomGenerator m_instance;
- RandomGenerator(){
- seed( time(NULL) * getpid() );
- }
- ~RandomGenerator(){}
- public:
- static RandomGenerator& instance(){
- return m_instance;
- }
- };
|
Maintenant je suis en train de multithreader mon code avec OPENMP, et je voudrais faire ça un peu propremment. Comme je voudrais avoir le même RNG dans tous les threads, je suis confronté au problème suivant :
L'appel est donc de la forme :
Code :
- boost::bernoulli_distribution<> distrib(threshold);
- event = distrib(RandomGenerator::instance());
|
sauf que j'ai cru comprendre que boost::mt19937 n'est pas thread-safe. Donc je peux avoir deux threads qui appellent le RNG en même temps et qui vont donc avoir le même résultat. Et je ne vois pas trop comment m'en sortir. En effet, ce qui devrait être locké, ce n'est pas le fait de demander l'instance du RNG, mais l'utilisation qu'en fait la distribution.
Est-ce que je vais devoir me rabattre sur un RNG par thread (comme j'utilise OpenMP je sais pas trop comment ça va être possible) ou y a-t-il un solution à ce problème ?
Message édité par Lan Wezel le 28-10-2010 à 18:19:57