如何在C++(std::thread的子类)中正确创建线程类的子类

How to create a subclass of thread Class properly in C++(subclass of std::thread)

本文关键字:子类 创建 线程 std thread C++      更新时间:2023-10-16

我正在尝试创建一个类Parallel它是std::thread的子类,因此我的类是在Parallel.h中定义的,但是在单独的文件中定义了main方法main.cpp在同一项目中(在Visual Studio中(。当我创建一个Parallel实例并在main()方法中执行join()函数时,如下面的代码段:我是C++新手,这里是"Parallel.h"-

#include<thread>
using namespace std;
namespace Para{
class Parallel:thread
{
public:
    static void run(){
    }
    Parallel(void)
    {
    }
    virtual ~Parallel(void)
    {
    }
    inline static void start(Parallel* p){
                // (*p).join();
    }
    virtual void Parallel::start(thread& t){
    }
    static void parallelize(Parallel& p1,Parallel& p2){
    }
    inline virtual Parallel* operator=(thread* t){
        return  static_cast<Parallel*>(t);
    }
}
/

/在主.cpp

void main(){
    Parallel p;
    p.join();
    thread t(print);
     t.join();
     system("Pause");
}

问题是如何定义一个线程类的正确子类,该子类具有以函数名称作为参数的重载构造函数,以及当p.join()编译器定义时,在VS2012中给出以下错误:

错误

2 错误 C2247:"std::thread::join"不可访问,因为"Para::P arallel"使用"private"从"std::thread"继承 C:\Users\Gamer\Desktop\PROJECQ\VC++@OMAQ\CQ47\CQ47\main.cpp 11

3 IntelliSense:函数"std::thread::join"(在"H:\Program Files (x86(\Microsoft Visual Studio 11.0\VC\include\thread"(的第209行声明(无法访问c:\Users\Gamer\Desktop\PROJECQ\VC++@OMAQ\CQ47\CQ47\main.cpp 11

当您尝试调用"p.join(("时,关于"使用'private'继承"的错误是因为您编写了:

    class Parallel:thread

当你应该写:

    class Parallel : public thread

默认值为私有继承,这意味着基类的所有方法在继承类上都变为私有。如果希望继承可访问,则必须指定继承应为公共继承。

在 Java 中,函数不是一等公民,因此与函数相关的一切都是通过类和继承来实现的,就像在 Swing 的观察者模式的实现中一样: 你创建一个类来实现事件处理程序的接口(你必须实现整个类才能提供一个函数(。

线程

也会发生同样的情况:因为你不能将函数传递给线程(因为Java没有"函数"的概念(,你必须从实现你自己的函数的线程类派生才能执行,或者传递一个实现Runnable接口的类,该接口提供要执行的函数(与Observer情况完全相同(。

在C++函数是一等公民(以函数指针、lambda、函子等形式(,所以这里的机制是将要执行的函数传递给线程。

如果你有一个 OO 分配,请考虑通过组合来适应线程(将执行线程存储为类的成员(,而不是从它继承。

注意:Java 8

仅作为旁注,Java 8 实现了 lambda,并通过它们提供函数引用(万岁!但是它使用接口实现lambda,因为它表明在Java中函数永远不会是一等公民。 接口的问题在于它完全打破了lambda的通用性:lambda可以在任何与其签名匹配的上下文中使用。Java lambdas并非如此:你必须实现相同的接口。