Résolution de l'erreur R6016 - Espace insuffisant pour les données de thread
Mon statiquement lié Visual C++ 2012 programme de façon sporadique génère un CTRL erreur: "R6016 - Pas assez d'espace pour le fil de données".
La documentation minimale de Microsoft indique ce message d'erreur est généré lorsqu'un nouveau thread est engendré, mais pas assez de mémoire peut être alloué pour cela.
Cependant, mon code ne explicitement génère un nouveau thread dans quelques cas bien définis, ce qui n'est pas produit ici (bien que certainement les bibliothèques Microsoft en interne frayer fils à bien). Un utilisateur a signalé ce problème lorsque le programme a été juste en existant dans l'arrière-plan.
Ne sais pas si c'est pertinent, mais je n'ai pas remplacé la valeur par défaut de 1 mo réservés taille de la pile ou de la taille de segment de mémoire, et la mémoire totale utilisée par mon programme est généralement assez faible (3 MO-10 MO sur un système avec 12 go réelle de la RAM, plus de la moitié de ce qui est non alloué).
Cela arrive très rarement, donc je ne peux pas le suivre vers le bas), et il a été rapporté sur plus d'une machine. J'ai seulement entendu parler de cela sur Windows 8.1, mais je ne lis pas trop.
Est-il un compilateur paramètre quelque part qui pourrait influer sur cette erreur? Ou erreur de programmation?
source d'informationauteur Dev93 | 2014-01-15
Vous devez vous connecter pour publier un commentaire.
Ce qui s'est avéré être causée par d'appeler CreateThread plutôt que _beginthread. La documentation de Microsoft dans la section des Remarques états qui CreateThread provoque des conflits lors de l'utilisation de la bibliothèque CRTet en effet, une fois que nous avons fait le changement, nous n'avons jamais vu cette erreur à nouveau.
Vous devez appeler TlsAlloc dans DllMain si la version de Windows Vista ou supérieur .
ko 118816
Votre code de la DLL doit être modifié pour utiliser ces TLS fonctionne comme TlsAlloc, et d'allouer TLS si la DLL est chargée avec la fonction LoadLibrary. Ou, la DLL à l'aide de __declspec(thread) ne doit être implicitement chargés dans l'application.
Ligne du bas: LoadLibrary n'est pas thread-safe.
J'ai découvert que le processus est en 32 bits.
Dans ce cas, j'ai augmenter la mémoire de processus avec la commande