2013-05-07 97 views
2

我正在嘗試使用for循環創建3個線程。以下是我的代碼片段:無法使用for循環創建多個線程

DWORD WINAPI ThreadProc0(LPVOID param) 
{ 
    return 0; 
} 
DWORD WINAPI ThreadProc1(LPVOID param) 
{ 
    return 0; 
} 
DWORD WINAPI ThreadProc2(LPVOID param) 
{ 
    return 0; 
} 

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) 
{ 
    DWORD threadId = 0; 
    int max_number=1; 
    //Start the threads 
    typedef DWORD (WINAPI * THREADPROCFN)(LPVOID lpParameter); 
    THREADPROCFN function[3] = {ThreadProc0,ThreadProc1,ThreadProc2} ; 
    for (int i = 0; i < max_number; i++) 
    { 
     CreateThread(NULL, 
        0, 
        (LPTHREAD_START_ROUTINE)&function[i], 
        (LPVOID) i, 
        0, 
        NULL 
        ); 
    } 
} 

代碼編譯成功,但執行時,錯誤是solution.exe已停止工作。 當我調試的代碼,我得到以下錯誤:

未處理的異常在0x0034fd00在Solution.exe:0000005:訪問衝突。

等待幫助。

+1

如果將[(LPTHREAD_START_ROUTINE)&function [i],''改爲'(LPTHREAD_START_ROUTINE)函數[i]),會發生什麼情況?(即不要取指向函數的指針地址,將指針指向函數) – 2013-05-07 07:48:23

+1

請注意,您的問題與創建多個線程無關,因爲'max_number'設置爲1 - 您只是試圖創建一個線程。 – 2013-05-07 08:07:36

+0

+1指出問題:) – Ayse 2013-05-07 08:14:29

回答

3

您可能希望function[i]i th函數指針指向一個線程啓動例程)而不是&function[i](指向指向線程啓動例程的第012個函數指針的指針)。

typedef DWORD (WINAPI * THREADPROCFN)(LPVOID lpParameter); 
    THREADPROCFN function[3] = {ThreadProc0,ThreadProc1,ThreadProc2} ; 

    for (int i = 0; i < max_number; i++) 
    { 
     CreateThread(NULL, 
        0, 
        //      v Here! 
        (LPTHREAD_START_ROUTINE)&function[i], 
        (LPVOID) i, 
        0, 
        NULL 
        ); 
    } 

是與C++比我曾經是,我覺得轉換後,中投以LPTHREAD_START_ROUTINE將成爲多餘不太熟悉。

+0

它現在的作品:) 非常感謝你的幫助! – Ayse 2013-05-07 08:02:28

+2

另外 - 擺脫不必要的'(LPTHREAD_START_ROUTINE)'強制轉換。如果沒有強制轉換,編譯器會給出關於傳入錯誤類型指針的警告。演員可以阻止編譯器發出關於這個問題的警告 - 它有效地告訴編譯器:「不用擔心,即使它看起來沒有意義,我也知道我在做什麼。」如果你傳遞了正確的指針類型,你將不需要轉換,編譯器也不會抱怨。 – 2013-05-07 08:05:58

+1

+1的解釋 – Ayse 2013-05-07 08:15:12