首页 > 解决方案 > 如何在 C++ 中运行具有仅调用线程的函数的类的多个对象?

问题描述

我有一个名为WiFiControlImplementation的子类,它是另一个名为WifiSniffer的类的子类

WiFiControlImplementation 包含一个公共方法:

class WiFiControlImplementation : public WifiSniffer {
    public:
       WiFiControlImplementation(){};
       void startControlProcess (void);
    private:
       bool callback            (void) override;

它从 WifiSniffer 继承了两个函数:

class WifiSniffer{
    public:
       WifiSniffer(){};
       void  run                (void);
       void  runChannelHop      (int hopscale);
    private:
       virtual bool callback         (void);

函数 startControlProcess 必须在不同的线程中运行两个继承的函数:

void WiFiControlImplementation::startControlProcess(){
   std::thread channelhop  (&WiFiControlImplementation::runChannelHop,this,3);
   std::thread runner      (&WiFiControlImplementation::run,this);
}

现在如果我想在另一个主文件(例如:main.cpp)中运行对象怎么办?我这样做:

   #include "wifi_ControlImplementation.h"
   int main(int argc, char **argv){
      WiFiControlImplementation job;
      job.startControlProcess();
      while(1){}; // For not stopping the main thread so that the object thread can still run ?
   }

如果我想像这样运行同一个类的多个对象,我应该怎么做:

   #include "wifi_ControlImplementation.h"
   int main(int argc, char **argv){
      WiFiControlImplementation job;
      job.startControlProcess();

      WiFiControlImplementation job2;
      job2.startControlProcess();

      WiFiControlImplementation job3;
      job3.startControlProcess();
      while(1){};
   }

标签: c++multithreadingc++11

解决方案


为了在主程序的线程中运行类函数,我只是为它们中的每一个使用了一个函数,第二个函数返回一个线程,该线程在 lambda 调用中执行第一个函数,下面是示例:

  • wifi_Hopper.h 中
#include <thread>
class wifi_Hopper {
     public:
        wifi_Hopper(){};
        std::thread start_thread(void) {
            return std::thread( [=] { start_hopping(); } );
        }
     private:
        void start_hopping(void);
}
  • main.cpp中:
#include "wifi_Hopper.h"
int main(int argc, char **argv){
   wifi_Hopper wH;
   std::thread HopperThread = wH.start_thread();
   HopperThread.join();
   return 0;
}
  • 你可以在一个类中定义多个函数,并为每个函数创建一个线程返回函数,你可以用类的同一个对象调用它们。

推荐阅读