2

我正在尝试使用 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:访问冲突。

等待帮助。

4

1 回答 1

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

于 2013-05-07T07:54:47.483 回答