如何在 C++ 中运行具有仅调用线程的函数的类的多个对象?

Posted

技术标签:

【中文标题】如何在 C++ 中运行具有仅调用线程的函数的类的多个对象?【英文标题】:How to run multiple objects of a class having a function calling only threads in C++? 【发布时间】:2020-06-11 09:27:14 【问题描述】:

我有一个名为 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);
   

【问题讨论】:

嗨serialback,欢迎来到***!您是否尝试过运行您发布的代码?如果是这样,会发生什么? while(1); 不,你不应该那样做。这是什么意思? 当我在没有 while(1) 的情况下运行程序时,程序退出时终止“在没有活动异常中止的情况下调用”问题,因为主函数正在调用一个对象,该对象的函数只运行线程,所以主程序只是运行线程并退出,如果主程序退出,线程将被杀死,对吗?我应该如何解决它 【参考方案1】:

为了在主程序的线程中运行类函数,我只是为它们中的每一个使用了一个函数,第二个函数返回一个线程,该线程在 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);

ma​​in.cpp 中:
#include "wifi_Hopper.h"
int main(int argc, char **argv)
   wifi_Hopper wH;
   std::thread HopperThread = wH.start_thread();
   HopperThread.join();
   return 0;

您可以在一个类中定义多个函数,并为每个函数创建一个线程返回函数,您可以使用该类的同一个对象调用所有这些函数。

【讨论】:

以上是关于如何在 C++ 中运行具有仅调用线程的函数的类的多个对象?的主要内容,如果未能解决你的问题,请参考以下文章

带继承的多线程 (C++)

如何在 C++ 中调用父类中的函数? [复制]

c++ 当我创建结构数组时,如何使用结构数组内的类的参数调用构造函数?

如何将基类的未知子类放在一个数据结构中并在 C++ 中调用重写的基类函数

在 C++ 中使用参数在构造函数中定义自己的类的数组

C++如何运行多个可以随时调用的后台函数线程?