Question Comment définir un nom pour un thread Win32?


Comment définir un nom pour un thread Win32. Je n'ai trouvé aucune API Win32 pour obtenir la même chose. Fondamentalement, je veux ajouter le nom de thread dans le fichier journal. TLS (Thread Local Storage) est-il le seul moyen de le faire?


16
2018-05-25 08:32


origine


Réponses:


Vous pouvez toujours stocker ces informations pour vous-même dans une structure de données appropriée. Utilisez un hachage ou une carte pour associer GetThreadId () à ce nom. GetThreadId () étant toujours un identifiant unique, cela fonctionne très bien.

À votre santé !

Bien sûr, s'il crée beaucoup   threads, ce hashmap va remplir lentement   up et utiliser de plus en plus de mémoire, donc   une procédure de nettoyage est probablement un   bonne chose aussi.

Vous avez absolument raison. Lorsqu'un fil meurt, l'entrée correspondante dans la carte doit naturellement être supprimée.


1
2018-05-25 09:25



Est-ce que cela aide ? Comment: définir un nom de thread dans le code natif

En code managé, il est aussi simple que de définir la propriété Name de l'objet Thread correspondant.


30
2018-05-25 08:36



http://msdn.microsoft.com/en-us/library/xcb2z8hs(VS.90).aspx

//
// Usage: SetThreadName (-1, "MainThread");
//
#include <windows.h>
const DWORD MS_VC_EXCEPTION=0x406D1388;

#pragma pack(push,8)
typedef struct tagTHREADNAME_INFO
{
   DWORD dwType; // Must be 0x1000.
   LPCSTR szName; // Pointer to name (in user addr space).
   DWORD dwThreadID; // Thread ID (-1=caller thread).
  DWORD dwFlags; // Reserved for future use, must be zero.
} THREADNAME_INFO;
#pragma pack(pop)

void SetThreadName( DWORD dwThreadID, char* threadName)
{
   THREADNAME_INFO info;
   info.dwType = 0x1000;
   info.szName = threadName;
   info.dwThreadID = dwThreadID;
   info.dwFlags = 0;

   __try
   {
      RaiseException( MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR),       (ULONG_PTR*)&info );
  }
  __except(EXCEPTION_EXECUTE_HANDLER)
  {
  }
}

18
2018-04-28 14:44



Les threads Win32 n'ont pas de noms. Il existe une convention Microsoft selon laquelle les applications génèrent des exceptions SEH spéciales contenant un nom de thread. Ces exceptions peuvent être interceptées par les débogueurs et utilisées pour indiquer le nom du thread. Quelques réponses couvrent cela.

Cependant, tout est géré par le débogueur. Les threads eux-mêmes sont des objets sans nom. Donc, si vous voulez associer des noms à vos threads, vous devrez développer votre propre mécanisme. Bien que vous puissiez utiliser le stockage local de threads qui vous permettra uniquement d'obtenir le nom du code exécuté dans ce thread. Ainsi, une carte globale entre l'identifiant de thread et le nom semble être l'approche la plus naturelle et la plus utile.


10
2018-04-24 18:31



Vous pouvez utiliser un objet de stockage local de thread pour stocker le nom. Par exemple,

__declspec( thread ) char threadName[32];

Ensuite, vous pouvez écrire et lire ceci depuis un thread. Cela peut être utile dans une application de journalisation, où vous souhaitez imprimer le nom du thread pour chaque message. Vous souhaitez probablement écrire cette variable dès le démarrage du thread et lancer également l'exception Microsoft (https://stackoverflow.com/a/10364541/364818) afin que le débogueur connaisse également le nom du thread.


4
2018-04-22 17:55



Selon les discussions avec les responsables de l'équipe de débogage de Microsoft (voir le lien ci-dessous pour plus de détails), l'API SetThreadDescription est l'API qui sera utilisée par Microsoft pour prendre en charge le nommage des threads officiellement dans le code natif. Par "officiellement", je veux dire une API supportant MS pour nommer les threads, par opposition au hack de lancer d'exception actuel qui ne fonctionne actuellement que pendant l'exécution d'un processus dans Visual Studio.

Cette API est devenue disponible à partir de Windows 10, version 1607.

Actuellement, il existe très peu de prise en charge des outils, de sorte que les noms que vous définissez ne seront pas visibles dans les débogueurs Visual Studio ou WinDbg. En avril 2017, cependant, les outils Microsoft xperf / WPA le prennent en charge (les noms des threads nommés via cette API afficheront correctement leurs noms dans ces outils).

Si vous souhaitez voir cette prise en charge améliorée, comme dans WinDbg, Visual Studio et les fichiers de vidage sur incident, votez pour cela en utilisant ce lien:

https://visualstudio.uservoice.com/forums/121579-visual-studio-ide/suggestions/17608120-properly-support-native-thread-naming-via-the-sett


2
2018-05-04 15:23



Si vous voulez voir le nom de votre thread dans le débogueur (windbg ou visual studio):      http://blogs.msdn.com/stevejs/archive/2005/12/19/505815.aspx

Je ne suis pas vraiment sûr qu'il existe une méthode inverse pour obtenir le nom du thread. Mais TLS sonne comme la voie à suivre.


1
2018-05-25 18:21



Une autre façon de faire est de stocker un pointeur sur le nom dans le champ ArbitraryUserPointer du TEB du thread. Cela peut être écrit et lu à l'exécution.

Il y a un article CodeProject intitulé "Débogage avec le bloc d'informations sur les threads" cela vous montre comment faire cela.


1
2017-08-06 14:21