【问题标题】:How to create multiplethreads each with different ThreadProc() function using CreateThread()如何使用 CreateThread() 创建具有不同 ThreadProc() 函数的多个线程
【发布时间】:2013-04-26 05:42:26
【问题描述】:

我已经使用 CreateThread() 成功创建了一个线程。

现在我想创建“n”个线程,但每个线程都有不同的 ThreadProc()。

我尝试了以下代码,但使用它,创建了“n”个线程,它们都执行相同的任务(因为所有线程的 Threadproc() 函数都是相同的。)

    //Start the threads
for (int i=1; i<= max_number; i++) 
{
CreateThread( NULL, //Choose default security
              0, //Default stack size
              (LPTHREAD_START_ROUTINE)&ThreadProc,
              //Routine to execute. I want this routine to be different each time as I want each  thread to perform a different functionality.
              (LPVOID) &i, //Thread parameter
              0, //Immediately run the thread
              &dwThreadId //Thread Id
            ) 
}

有什么方法可以创建“n”个线程,每个线程都有不同的线程过程?

【问题讨论】:

  • 呃...给每个人传递一个指向不同线程过程的指针!恐怕我不明白为什么这样做很困难,或者你想做什么。从反对票来看,其他人也没有。你能解释一下你想做什么以及为什么吗?
  • @DavidM :“给每个人传递一个指向不同线程过程的指针!”我想这就是我一直在寻找的 :) 非常感谢 :)
  • 哈!不用担心,很高兴它是如此简单:)

标签: c windows multithreading winapi createthread


【解决方案1】:

试试这个:

DWORD WINAPI ThreadProc1(  LPVOID lpParameter)
{
  ...
  return 0 ;
}

DWORD WINAPI ThreadProc2(  LPVOID lpParameter)
{
  ...
  return 0 ;
}

...

typedef DWORD (WINAPI * THREADPROCFN)(LPVOID lpParameter);

THREADPROCFN fntable[4] = {ThreadProc1, ThreadProc2, ...} ;

//Start the threads
for (int i = 0; i < max_number; i++) 
{
  DWORD ThreadId ;

  CreateThread( NULL,
                0,
                (LPTHREAD_START_ROUTINE)fntable[i],
                (LPVOID) i,
                0,
                &ThreadId
              ) ;
}

这将使用 fntable 中定义的不同线程过程(TreadProc1、ThreadProc2 等)启动 max_number 个线程。

【讨论】:

  • 是否可以创建两个具有相同线程过程调用和不同参数传递给每个线程的线程过程调用的线程。例如对于线程#1,线程过程是“threadProc()”,参数是“thread1”。对于线程#2,线程过程为“threadProc()”,参数为“thread2”
  • 这正是您在示例中所做的,只是您必须编写“(LPVOID)i”而不是“(LPVOID)&i”。
  • 我一直在尝试上述代码。它编译成功,但是在执行代码时,我得到了 solution.exe 已停止工作的错误。请给我一个解决方案好吗?
  • Creating40Threads.exe 中 0x003bf9a8 处未处理的异常:0xC0000005:访问冲突。
  • 它在哪里崩溃?你的调试器应该告诉你。显示您的代码。
猜你喜欢
  • 1970-01-01
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
  • 2018-03-10
相关资源
最近更新 更多