Bonjour,
Je voudrais savoir quelle est la méthode la plus simple pour stocker des variable dans un thread ?
Je veux dire faire l’équivalent de la fonction API SetLastError,GetLastError, et de visualstudio srand ,rand.
Comment faire ?
Merci beaucoup.
Version imprimable
Bonjour,
Je voudrais savoir quelle est la méthode la plus simple pour stocker des variable dans un thread ?
Je veux dire faire l’équivalent de la fonction API SetLastError,GetLastError, et de visualstudio srand ,rand.
Comment faire ?
Merci beaucoup.
La plus simple, mais pas forcément la plus propre:
Code:__declspec(thread) int g_myGlobalVar;
La façon "propre" implique elle aussi l'usage d'une variable globale:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 TLS_INDEX g_myIndex = TlsAlloc(); void MyCallbackFunction() { MyStructure * pMyStructure = (MyStructure *)TlsGetValue(g_myIndex); ... } DWORD STDCALL ThreadProc(void*) { MyStructure *pMyStructure = CreateMyStructure(); TlsSetValue(g_myIndex, pMyStructure); PoorlyThoughtCallbackUsingFunction(&MyCallbackFunction); DestroyMyStructure(pMyStructure); TlsSetValue(g_myIndex, NULL); return 0; }
OK, merci,
mais existe-t-il l'équivalent de ?
Code:
1
2
3
4
5 BOOL TlsSetValueByThreadID( DWORD ThreadID, DWORD dwTlsIndex, LPVOID lpTlsValue );
Cette fonction n'existe pas, c'est un exemple.
Pour autant que je sache, non, rien de la sorte: Les fonctions sur le TLS (hormis TlsAlloc et TlsFree) n'affectent que le thread courant.
C'est ce qui rend l'initialisation et le nettoyage un peu problématique.
Un thread va devoir nettoyer lui-même son slot TLS en fin de traitement, s'il y a mis un pointeur vers de la mémoire allouée dont il est le seul propriétaire. C'est ce que j'ai mis dans mon code d'exemple:
Code:
1
2 DestroyMyStructure(pMyStructure); TlsSetValue(g_myIndex, NULL);
Par contre, les threads peuvent toujours communiquer autrement: Si un thread possède une boucle de messages et une fenêtre (qui peut être une fenêtre message-only invisible), un SendMessage() permettrait de faire des appels synchrones, y compris ordonner à un thread de nettoyer son TLS...