probleme mit threads
-
eigentlich ist es kein Problem mit den threads, sondern mit ihrem ende. ich nutze hierfür WaitForMultipleObjects (), docch dieses liefert mir immer einen Fehler zurück:
#define MAX_THREADS 128 #include <iostream> #include <cstdio> #include <col_iostream.cpp> #include <windows.h> using namespace std; CRITICAL_SECTION mySection; DWORD WINAPI ThreadFunc (LPVOID Data); int main() { HANDLE hThread[MAX_THREADS]; DWORD dwThread[MAX_THREADS]; InitializeCriticalSection (&mySection); for (int i=0; i < MAX_THREADS; i++) { hThread[i] = CreateThread (NULL, 0, ThreadFunc, (LPVOID) (i * (64*1024/MAX_THREADS)), 0, &dwThread[i]); } if (WaitForMultipleObjects (MAX_THREADS, hThread, TRUE, INFINITE) == WAIT_FAILED) { cout << "Wait failed! Code: " << GetLastError () << endl << endl; } system("Pause"); DeleteCriticalSection (&mySection); return 0; }
der ErrorCode ist 151, also:
The number of specified semaphore events for DosMuxSemWait is not correct.
(aus MSDN)
was habe ich falsch gemacht?
[ Dieser Beitrag wurde am 19.06.2003 um 19:19 Uhr von N00Bie editiert. ]
-
Ich könnte mir vorstellen, dass es daran liegt, dass WaitForMultipleObjects nur auf MAXIMUM_WAIT_OBJECTS (inho def. als 64) Objekte warten kann (siehe Doku: nCount). Bei dir übergibst du hier aber MAX_THREADS (128)
-
zur Hölle mit Flenders (sorry, konnt ich mir nicht verkneifen
)
würde das Problem wenn ich#define MAXIMUM_WAIT_OBJECTS 128
einfüge?
[ Dieser Beitrag wurde am 19.06.2003 um 20:43 Uhr von N00Bie editiert. ]
-
ich denke nicht - weis es aber nicht - da es intern von windows mit der alten einstellung genutzt wird... also nehm für beides den kleinsten wert von beiden...
-
Wenn die Funktion nur 64 Events verarbeiten kann, warum dann nicht das Event-Feld in 64er-Blöcke unterteilen und WaitForMultipleObjects in einer Schleife für jeden Block aufrufen?
Dass dann das Warten allerdings nicht INFINITE erfolgen kann, muss wohl net extra erläutert werden ...
-
Warum kann man nicht einfach 2 mal hintereinander WaitForMultipleObjects für je 64 Objekte mit INFINITE aufrufen
-
@flenders
Die Frage ist jetzt nicht ernst gemeint, oder?
-
Doch - hab glaub ich grad nen Hänger
- kann doch jedem mal passieren
-
hast du heute augenprobleme?
-
unter anderem :p
-
Woher willst Du wissen, ob das Event 'Bierkastenleer' gesetzt ist, wenn Du nur 10 von 20 Flaschen im Blickwinkel hast?
-
Den Vergleich verstehe ich nicht so ganz, denn hier gibt es doch keine Abhängigkeiten, oder übergeordnete Objekte. Er will ja warten biss alle Objekte signalisiert sind (erst dann erwacht der Main-Thread ja wieder). Da kann er doch dann auch erst auf die ersten 64 warten und dann auf den Rest - verstehe ich leider immernoch nicht so richtig
-
Er will ja warten biss alle Objekte signalisiert sind
Sorry, das hab ich übersehen.
-
void threadFunc(void*) { while(1); } _beginthread( threadFunc , 0 , NULL );
.. dazu gibt es auch ne terminateThread , ausser der thread beendet sich selbst mit return;
mgf
-
thx für alle antworten, der vorschlag von RenéG hat funktioniert