LPTHREAD_START_ROUTINE /类数组

时间:2009-09-25 13:18:26

标签: c++ multithreading

我写了一些这样的测试代码,编译和工作正常......

void threadtest()
{
  HANDLE hThrd;
  DWORD threadId;
  int i;

  for (i = 0;i < 5;i++)
  {
    hThrd = CreateThread(
      NULL,
      0,
      ThreadFunc,
      (LPVOID)i,
      0,
      &threadId );
  }
  // more stuff
}

DWORD WINAPI ThreadFunc(LPVOID n)
{
  // stuff
  return 0;
}

然后我想修改代码以将ThreadFunc放入一个类中,然后声明这些类的数组。我认为代码应该是这样的:

class thread_type
{

  public:

  DWORD WINAPI ThreadFunc(LPVOID n)
  {
    // stuff
    return 0;
  }
};

void threadtest()
{
  HANDLE hThrd;
  DWORD threadId;
  int i;
  thread_type *slave;

  slave = new thread_type[5];

  for (i = 0;i < 5;i++)
  {
    hThrd = CreateThread(
    NULL,
    0,
    slave[i].ThreadFunc,
    (LPVOID)i,
    0,
    &threadId );
  }
  // more stuff
}

不幸的是编译器抱怨线路slave [i] .ThreadFunc,我想我可能需要一些特殊的转换,但我尝试涉及“::”和“&amp;”的所有排列似乎失败了(我对C ++很陌生)。真正的代码有一些额外的复杂性,我没有包括在内以保持清晰,但我认为它们是无关紧要的。

2 个答案:

答案 0 :(得分:4)

代码的第一个问题,即测试类不是thread_type的后代。不知何故,您需要指定基类。 第二,如果你传递函数指针,那不应该是thiscall类型。解决方案通常是:

struct thread
{
  virtual void
  run() = 0;

  static thread_func(void* param)
  {
    thread* pThread = (thread*)param;
    thread->run();
  }
}


struct worker : public thread
{
  void
  run()
  {
    (.. code for the thread...)
  }
}

void threadtest()
{
  HANDLE hThrd;
  DWORD threadId;
  int i;
  thread *slave;

  slave = new thread_type[5];
  slave[0] = new worker;
  slave[1] = new worker;
  slave[2] = new worker;
  slave[3] = new worker;
  slave[4] = new worker;

  for (i = 0;i < 5;i++)
  {
    hThrd = CreateThread(
    NULL,
    0,
    &thread::thread_func,
    (LPVOID)slave[i],
    0,
    &threadId );
  }
  // more stuff
}

请注意,这可能只是一个反映,我现在无法编译,因为我没有这里做任何事情,但逻辑应该是这样的。

答案 1 :(得分:1)

以下说明指向函数的指针和指向成员函数C++ FAQ Lite的指针之间的区别。请参阅第33.2节,其中解释了为什么您所做的事情是个坏主意。