RNG et multithreading - C++ - Programmation
Marsh Posté le 28-10-2010 à 18:11:19
J'ai trouvé une solution, mais je ne sais pas si c'est très propre.
Comme l'operateur () des random::distribution est template de l'Engine (RNG), j'ai réimplémenté l'operateur () du RNG en mettant une section critique.
Code :
|
Je suis ouvert à toute critique (acerbe ou non) sur la propreté de cette solution car l'operateur boost::mt19937::operator()() n'est pas "virtual". Il aurait peut-être été plus propre de le wrapper complètement plutôt que d'en hériter.
Marsh Posté le 29-10-2010 à 21:30:44
Ton problème est le sujet de cette discussion: http://www.wilmott.com/messageview [...] TARTPAGE=1
En page 3, sont mentionnées des impléms particulières comme http://trng.berlios.de/
Marsh Posté le 28-10-2010 à 16:34:33
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.
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 :
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