Help and Support

Numéro d'article: 176906 - Dernière mise à jour: mardi 21 novembre 2006 - Version: 4.1

BOGUE : accès du Registre à partir de plusieurs threads peut échouer

Sommaire

Agrandir tout | Réduire tout

Symptômes

Une erreur peut se produire si vous accédez simultanément la même clé de Registre à partir de plusieurs threads dans un processus unique. Par exemple, si plusieurs threads dans une application Win32 multi-thread conçue avec soin essayez d'ouvrir la même clé de Registre à l'aide RegOpenKeyEx () dans une boucle, la fonction peut échouer avec le code d'erreur de 6 suivant :
ERROR_INVALID_HANDLE
Cette erreur ne se produit pas frontières de processus. Par conséquent, deux processus de single-threaded concurrence pour la même clé de Registre ne seront pas affectés par ce bogue.

Cause

Ce comportement est par intermittence et est le résultat d'une condition de concurrence entre les threads simultanément l'accès à la même clé de Registre.

Résolution

Il existe plusieurs solutions de contournement possibles de cette situation :
  1. Ne pas accéder à le même emplacement de registre de plusieurs threads dans un processus simple.
  2. Synchroniser l'accès à l'emplacement du Registre. Ce faire, la sérialisation d'accès au code qui accède au Registre avec une section critique ou d'autres mécanismes de synchronisation Win32.
  3. Lorsque cette erreur se produit, Sleep() une courte durée et essayez d'accéder à nouveau la clé de Registre. Il est une condition de concurrence qui provoque ce problème, donc cette solution de contournement n'est pas garantie pour fonctionner. Il est possible que la clé de Registre est effectivement non valide. Toutefois, ceci est la solution plus simple pour travailler dans une application existante.

Statut

Microsoft a confirmé qu'il s'agit un bogue dans les produits Microsoft répertoriés dans la section « S'applique à ».

Plus d'informations

Le code exemple suivant illustre le problème avec la fonction RegOpenKeyEx(). Notez que l'erreur s'uniquement produit par intermittence avec le code suivant.

Exemple de code

   #include <windows.h>
   #include <winbase.h>
   #include <stdio.h>

   #define ITERATIONS 1000
   VOID ThreadFunc(LPVOID);

   void main(void)
   {
    int numThreads=100;
    DWORD threadID;
    int i;

     for (i=0; i<numThreads; i++)
     {
       CreateThread(0, 0,(LPTHREAD_START_ROUTINE) ThreadFunc,
                    0, 0, &threadID);
     }
     return;
   }

   VOID ThreadFunc(LPVOID)
   {
     LONG rc;
     HKEY hKey;

     for(int i=0; i < ITERATIONS; i++)
     {
       rc = RegOpenKeyEx( HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft",
                          0, KEY_ALL_ACCESS, &hKey);

       if (rc != ERROR_SUCCESS)
         printf("Iteration(%d): Thread Id: %d, Error=%d\r\n", i,
                                   GetCurrentThreadId(), rc);
       else
          rc = RegCloseKey(hKey);
     }
   }
				

Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Win32 Application Programming Interface sur le système suivant
    • Microsoft Windows NT 4.0
    • the operating system: Microsoft Windows 2000
Mots-clés : 
kbmt kbapi kbbug kberrmsg kbkernbase kbpending kbregistry KB176906 KbMtfr
Traduction automatiqueTraduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 176906  (http://support.microsoft.com/kb/176906/en-us/ )
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Traductions disponibles