2016-04-29 12 views
0

Ich muss zwei Threads erstellen, von denen einer gerade Zahlen zurückgibt und der andere ungerade Zahlen zurückgibt. Was mache ich falsch?Arbeiten mit Threads in C++

here is my console

Here is a screenshot of my functions

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    DWORD ID1 = 1, ID2 = 100; 
    DWORD arr[] = {ID1, ID2}; 
    HANDLE h[1]; 
    for (int i = 0; i < 2; ++i) 
    { 
     h[0] = CreateThread(NULL, 0, &f1, arr, 0, &arr[0]); 
     if (h[0] == NULL) 
      _tprintf(_T("%d"), GetLastError()); 
     h[1] = CreateThread(NULL, 0, &f2, arr, 0, &arr[1]); 
     if (h[1] == NULL) 
      _tprintf(_T("%d"), GetLastError()); 
    } 

    WaitForMultipleObjects(2, h, TRUE, INFINITE); 

    for (int i = 0; i < 2; ++i) 
     CloseHandle(h[i]); 

    return 0; 
} 
+4

Für den Anfang hat das Array 'h' nur 1 Element, aber Sie versuchen, auf 2 von ihnen zu schreiben. – BoBTFish

+1

Sie erstellen 4 Threads aufgrund der Schleife. Entferne die for-Schleife und ändere h zu 'HANDLE h [2]; ', um dein Array groß genug für 2 Griffe zu machen. –

+0

@PeteBecker Tatsächlich tat ich es. Schlechte Angewohnheit, fürchte ich. –

Antwort

3

Ändern Sie diese

HANDLE h[1]; 
for (int i = 0; i < 2; ++i) 
{ 
    h[0] = CreateThread(NULL, 0, &f1, arr, 0, &arr[0]); 
    if (h[0] == NULL) 
     _tprintf(_T("%d"), GetLastError()); 
    h[1] = CreateThread(NULL, 0, &f2, arr, 0, &arr[1]); 
    if (h[1] == NULL) 
     _tprintf(_T("%d"), GetLastError()); 
} 

Um dies zu

HANDLE h[2]; 
h[0] = CreateThread(NULL, 0, &f1, arr, 0, &arr[0]); 
if (h[0] == NULL) 
    _tprintf(_T("%d"), GetLastError()); 
h[1] = CreateThread(NULL, 0, &f2, arr, 0, &arr[1]); 
if (h[1] == NULL) 
    _tprintf(_T("%d"), GetLastError()); 
  • Sie erstellen zwei Threads innerhalb des Körpers einer for-Schleife, die zweimal ausgeführt wird (AKA 4 Threads, wenn Sie wirklich für 2 gedacht sind).
  • Sie versuchen, die Griffe zu diesen Threads in ein HANDLE-Array zu speichern, das nur ein Element enthalten kann.
  • Bei der zweiten Ausführung der Schleife haben Sie die Elemente von h [] erneut überschrieben. Wenn Sie später darauf warten, dass sie beendet werden und versuchen, die Handles zu schließen, schließen Sie nicht einmal den gleichen Punkt.
  • Sie benötigen das HANDLE-Array, um Größe 2 zu sein, und Sie müssen die erste for-Schleife entfernen (Sie übergeben die Funktionszeiger separat, also gibt es keine Möglichkeit, dies in einer Schleife zu tun, wenn Sie die Funktionszeiger in eine Array von gleicher Länge wie h []).
+1

Können Sie näher erläutern, warum dies das Problem behebt? –

+1

Bitte erläutern Sie die Änderungen und warum die ursprüngliche Version Probleme verursacht. – BoBTFish

+0

Erläuterung hinzugefügt. Entschuldigung ... neu hier. –