Objekt-Jonglage, Das Hantieren unter Windows mit wirklich vielen Prozessen, Threads, Events ...,  c't 19/2011 S.176 
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Dateien:
WaiforMO: komplette Solution für Visual Studio 2008  32 & 64 bittig, debug &release

Die Solution enthält zwei Projekte :
WaitforM0: die C++-Klasse Cwait, wird als Library gelinkt 
WaitforMOTest: Testprogramm in klassischem C, das über eine Wrapperfunkion die Cwait-Klasse  benutzt

Das Programm adressiert das Problem, dass die Windos API von  WaitForMultipleObject() auf 64 Objekte beschränkt ist. Benötigt man mehr, kann 
man den Wartejob in Gruppen von bis zu 64 aufteilen, entweder nacheinander, was nur bei Waitall=true möglich ist, oder  kaskadiert mit Warte-Threads. 
Die hier vorgestellte Beispiellösung erweitert die Funktion auf bis zu 63*64 Objekte, muss dazu aber bei mehr als
128 Objekten neue Statuswerte für WAITTIMEOUT und WAIT_ABANDONED_0 einführen. (WAITTIMEOUTEX und WAIT_ABANDONEDEX_0)

Für C++-Programme steht die Klasse CWAIT mit ihren publizierten Methoden zur Verfügung:

   CWait(WAITTYPE WaitType, int aMaxObjects=0);                  
   ~CWait();                     
    						
    DWORD WaitForManyObjects(
						__in  DWORD Count,
						__in  const PHANDLE pHandles,
						__in  BOOL WaitAll,
						__in  DWORD Milliseconds);

    
   DWORD GetCreateResult();
	
Hier übergibt man mit dem Konstruktor die Maximalanzal der Objekte, so dass der  die nötigen Ressourcen bereitstellen kann. Mit
GetCreateResult() kann man sich über den Erfolg informieren (0: alles ok), ansonsten gab es Fehler beim Allozieren von Heap oder dem Erzeugen 
einesTerminate- Events.
    
 Die Methode  WaitForManyObjects arbeitet wie WaitForMultipleObjects(), nur eben mit mehr Handles. Zum Schluss sollte man dann das Objekt wieder freigeben. 
 
 Daneben gibt es die auch von alten C-Programmen nutzbare  Wrapper-Funktion WaitForManyObjects()  als diekten Ersatz von WaitForMulibleObjects() - aber ggf. mit anderen
 zurückgemeldeten Statuswerten -- die bei jedem Aufruf die Klasse automatisch erzeugt und 
 hernach wieder zerstört.
 
 Anbei ist noch ein kleines Testprogramm, bei dem man per #define alle möglichen Waitsituationen, Timouts, verlassene Mutexe für  Threads, Events, Mutexe einstellen 
 kann. Testweise ist dafür  in WaitForManyClass.h  #define TEST_MAXIMUM_WAIT_OBJECTS 2  gesetzt. Für eigene Programme mit mehr als 64 Objekten ist 
 diese Zeile unbedingt zu streichen und dann neu zu kompilieren. 
 
Diese Version enthält keinen Threadpool  für die Wartethreads, diese werden also bei jedem Aufruf erzeugt und wieder zerstört. 
  
Verbesserungsvorschläge sind wie immer  willkommen 

Viel Spaß 

Andreas Stiller 