C++继承和具有虚拟工作函数的Pthreads

C++ Inheritance and Pthreads with Virtual Worker Functions

本文关键字:工作 函数 Pthreads 虚拟 继承 C++      更新时间:2023-10-16

我有一个类,我正试图将其实现为抽象类,以最大限度地提高代码重用性。然而,这两个派生类之间的共同点主要在于,每个派生类都有一个使用者和生产者线程。我想知道是否可以让每个静态成员函数调用一个虚拟成员函数来完成所有底层工作。

基本上,下面的代码是允许的吗?或者我在做一些非常糟糕的事情,或者编译器会对我大喊大叫吗?

// in AbstractClass.h
class AbstractClass {
  // some code here including constructors/destructors
 protected:
  virtual int Worker() = 0;  // derived class provides implementation
 private:
  static void* Thread(void* args);
};
// in AbstractClass.cpp
static void* AbstractClass::Thread(void* args) {
  AbstractClass myobject = static_cast<AbstractClass*>(args);
  myobject->Worker();
}

基本上,我想知道派生类"worker"是否会被这样称呼?请注意,p_thread_create()是通过传入thread()函数来调用的。

感谢您的帮助,因为我试图提高我对继承和虚拟函数的理解,以及如何使用它来最大限度地提高代码重用。

是的,代码看起来很好,您的假设是正确的。虚拟函数的目的是,无论在哪个超类签名上调用该方法,都将调用函数的最派生版本

使用pthreads和C++,您所使用的方法是完全合理的,而不是简单的。然而,我会在一个单独的类中创建线程,该类将包含静态类方法。这将阻止线程在派生类中混合。

struct ThreadManager
{
  ThreadManager(AbstractWorker* worker)
  {
     mWorker = worker;
     mThread = ThreadStart(threadFunc, this); /* made up thread code :) */
  }
  ~ThreadManager()
  {
     ThreadStop(mThread);
  }
  static void* threadFunc(void* args)
  {
     ThreadManager* manager = static_cast<ThreadManager*>(args);
     manager->mWorker->Work();
  }
  AbstractWorker* mWorker;
  Thread mThread;
}

请注意,当使用pthreads时,实际上需要一个静态函数。