Bonjour tout le monde,
Je m'amuse avec un petit programme de test à l'apprentissage de la programmation multi-threader en C++ sous Windows. J'ai lu un peu la doc MSDN à ce sujet, et j'ai écrit un petit programme de test avec une fonction qui crée un fichier et écrit dedans (la fonction threadWrite), et un main qui crée des threads exécutant cette fonction.
Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
 
 
#include <Windows.h>
 
#include <iostream>
#include <fstream>
#include <sstream>
 
#define THREAD_NUMBER 10000
 
 
using namespace std;
 
DWORD WINAPI threadWrite( LPVOID lpParam ){
  int tNumber = 0;
  stringstream nameFile;
 
  tNumber = *((int*)lpParam);
  nameFile << "Test" << tNumber << ".txt";
 
  ofstream fichier(nameFile.str(), ios::out | ios::trunc);
 
  if(fichier){
    for(int i=0; i<5 ; i++)
      fichier << "Thread" << tNumber << endl;
 
    fichier.close();
  }
  else
    return 1;
 
  return 0;
}
 
 
 
int main(void){
  int tCount[THREAD_NUMBER];
  HANDLE threads[THREAD_NUMBER];
 
  cout << "debut" << endl;
 
  for( int i=0; i<THREAD_NUMBER ; i++ )
    tCount[i] = i+1;;
 
  for( int i=0 ; i<THREAD_NUMBER; i++ )
    threads[i] = CreateThread(NULL, 0, threadWrite, &tCount[i], 0, NULL);
 
  WaitForMultipleObjects( THREAD_NUMBER, threads, TRUE, INFINITE );
  cout << "fin" << endl;
 
  for( int i=0 ; i<THREAD_NUMBER; i++ )
    CloseHandle(threads[i]);
 
  return EXIT_SUCCESS;
}
Je test le programme avec différentes valeurs de THREAD_NUMBER, des fois à 100, 1000 puis 10000. Pour 100 et 1000 le programme semble bien marché, il y a bien 100 ou 1000 fichiers de créé avec les valeurs écrites dans chaque fichier.
Pour 10000 par contre le comportement du programme devient non déterministe d'une exécution à l'autre : des fois 2000 fichiers sont créés, d'autres 5000...
Mon code ne comporte aucune ressource partagée. Donc j'estime qu'il ne n'y a pas de problème de verrouillage nécessitant l'utilisation de sémaphore.
Je penche plutôt pour une limitation de nombre de threads créés simultanément. Ou alors le nombre de fichiers ouvert simultanément. Ou une autre limitation dont je n'aurais pas connaissance.
Merci de m'aider à résoudre mon problème.