无法使用for循环创建多个线程

时间:2013-05-07 07:47:13

标签: c windows multithreading winapi for-loop

我正在尝试使用for循环创建3个线程。以下是我的代码段:

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已停止工作。 当我调试代码时,我收到以下错误:

Solution.exe中0x0034fd00处的未处理异常:0xC0000005:访问冲突。

等待帮助。

1 个答案:

答案 0 :(得分:3)

您可能希望function[i]i函数指向线程启动例程而不是&function[i](指向线程的i函数指针的指针开始例程)。

   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会变得多余。