Maison >développement back-end >C++ >Comment puis-je garantir une génération de nombres aléatoires thread-safe en C ?

Comment puis-je garantir une génération de nombres aléatoires thread-safe en C ?

DDD
DDDoriginal
2024-12-06 04:30:13303parcourir

How Can I Ensure Thread-Safe Random Number Generation in C  ?

Préserver le caractère aléatoire sur plusieurs threads à l'aide de rand() de stdlib

Lors de l'emploi de plusieurs threads qui invoquent une fonction commune chargée de générer des nombres aléatoires distincts, il est crucial de prendre en compte le approche pour initialiser le générateur de nombres aléatoires. La fonction srand(time(0)) est responsable de l'initialisation du générateur. Cependant, son placement dans le code peut impacter la cohérence des résultats.

La question se pose de savoir si srand(time(0)) doit être invoqué une seule fois pour l'ensemble du programme, au début de chaque exécution de fonction. , ou s'il existe une stratégie alternative.

La réponse réside dans les problèmes de sécurité des threads associés à rand(). La documentation indique explicitement que rand() n'est pas thread-safe, ce qui signifie qu'il modifie l'état caché à chaque invocation. Pour garantir un comportement cohérent entre les threads, l'état doit être géré explicitement.

La fonction alternative rand_r() accepte un pointeur vers un entier non signé comme état, fournissant une quantité minimale d'informations sur l'état. Cette fonction se traduira par un générateur pseudo-aléatoire plus faible. Comme option améliorée, drand48_r(3) est recommandé.

Par conséquent, pour maintenir une génération de nombres aléatoires prévisible sur plusieurs threads, il est nécessaire d'utiliser des fonctions thread-safe comme rand_r() ou drand48_r(3) au lieu de rand().

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn