2013-05-07 101 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