Maison > développement back-end > C++ > Comment puis-je générer des nombres aléatoires uniques dans plusieurs threads à l'aide de la fonction `rand()` de C ?

Comment puis-je générer des nombres aléatoires uniques dans plusieurs threads à l'aide de la fonction `rand()` de C ?

Barbara Streisand
Libérer: 2024-12-16 09:28:14
original
978 Les gens l'ont consulté

How Can I Generate Unique Random Numbers in Multiple Threads Using C's `rand()` Function?

Utilisation multithread de rand() de stdlib

Dans les scénarios de programmation multithread, il est souvent nécessaire de générer des nombres aléatoires dans des threads séparés. Cependant, lorsque vous utilisez la fonction rand() de la bibliothèque standard, vous pouvez rencontrer des problèmes si elle n'est pas gérée correctement.

Problème

Plusieurs threads exécutant la même fonction produisent le même nombre aléatoire à plusieurs reprises. En effet, chaque thread possède généralement sa propre copie des données globales, y compris l'état interne de rand(), qui est partagé par tous les threads.

Solution

Pour éviter de générer les mêmes nombres aléatoires , il est nécessaire de gérer explicitement l'état interne de rand(). La documentation recommande ce qui suit :

  • Utilisez rand_r() avec un pointeur d'état explicite : rand_r() fournit une version thread-safe de rand() en vous permettant de transmettre un pointeur vers un entier non signé qui sera utilisé comme état.
  • Utilisez drand48_r(3) pour un Option plus faible mais thread-safe : drand48_r(3) est un générateur pseudo-aléatoire alternatif thread-safe qui utilise un état interne plus grand.

Exemple d'utilisation

Par exemple , pour utiliser rand_r() dans un environnement multithread, vous pouvez :

#include <stdlib.h>

void* thread_function(void* arg) {
  unsigned int state = 0;  // Thread-specific state
  while (1) {
    int random_number = rand_r(&state);
    // Do something with random_number
  }
  return NULL;
}
Copier après la connexion

Important Remarque

Il convient de noter que l'utilisation de rand() ou rand_r() sans une synchronisation appropriée des threads peut conduire à un comportement imprévisible et à des résultats incorrects. Assurez-vous toujours que des mécanismes de synchronisation appropriés sont en place pour gérer l'accès multithread aux ressources partagées, y compris les générateurs de nombres aléatoires.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal