【问题标题】:Unable to create multiple threads using for loop无法使用 for 循环创建多个线程
【发布时间】:2013-05-07 07:47:13
【问题描述】:

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

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:访问冲突。

等待帮助。

【问题讨论】:

  • 如果将(LPTHREAD_START_ROUTINE)&amp;function[i], 更改为(LPTHREAD_START_ROUTINE)function[i], 会发生什么(即不取函数指针的地址,取函数指针)
  • 请注意,您的问题与创建多个线程无关,因为 max_number 设置为 1 - 您只是尝试创建一个线程。
  • +1 指出问题:)

标签: c windows multithreading winapi for-loop


【解决方案1】:

您可能需要function[i](指向线程启动例程的ith 函数指针)而不是&amp;function[i](指向线程启动例程的ith 函数指针)。

   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 之后将变得多余。

【讨论】:

  • 另外 - 去掉不必要的 (LPTHREAD_START_ROUTINE) 演员表。如果没有强制转换,编译器将发出有关传入错误类型指针的警告。演员表阻止编译器发出有关问题的警告 - 它有效地告诉编译器,“别担心,我知道我在做什么,即使它看起来没有意义”。如果传入正确的指针类型,则不需要强制转换,编译器也不会抱怨。
猜你喜欢
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 2022-01-01
  • 1970-01-01
相关资源
最近更新 更多