2016-04-29 45 views
0

我需要創建兩個線程,其中一個將返回偶數,另一個將返回奇數。我究竟做錯了什麼?使用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

對於初學者來說,數組'h'只有1個元素,但是你試圖寫入2個元素。 – BoBTFish

+1

由於循環,您正在創建4個線程。刪除for循環並將h更改爲'HANDLE h [2];'使您的數組足夠大,以便處理2個句柄。 –

+0

@PeteBecker的確我做到了。我害怕的壞習慣。 –

回答

3

更改此

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()); 
} 

對此

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()); 
  • 您在for循環體內創建2個線程,執行兩次(當您真正意圖使用2個時,也就是4個線程)。
  • 您正試圖將這些線程的句柄保存到只能容納一個元素的HANDLE數組中。
  • 在循環的第二次執行中,您再次覆蓋了h []的元素,因此當您稍後等待它們完成並嘗試關閉句柄時,甚至不會關閉同一個句柄。
  • 您需要HANDLE數組的大小爲2,並且您需要刪除第一個for循環(您正在單獨傳遞函數指針,因此除非將函數指針放入一個循環中,否則無法在循環中執行此操作數組長度與h [])相同。
+1

你能否詳細解釋爲什麼這樣可以解決這個問題? –

+1

請解釋這些更改,以及爲什麼原始版本會導致問題。 – BoBTFish

+0

新增說明。對不起......新來的。 –