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

时间:2013-10-06 14:46:56

标签: c++ multithreading visual-studio-2012 c++11

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

main()

//在main.cpp

#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);
    }
}

问题是如何定义一个具有重载构造函数的线程类的正确子类,该函数名称作为参数, 当定义void main(){ Parallel p; p.join(); thread t(print); t.join(); system("Pause"); } 编译器在VS2012中给出以下错误时:

  

错误2错误C2247:'std :: thread :: join'无法访问,因为'Para :: Parallel'使用'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

2 个答案:

答案 0 :(得分:5)

当您尝试调用'p.join()'时,“使用'private'继承”的错误是因为您写了:

    class Parallel:thread

你应该写的时候:

    class Parallel : public thread

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

答案 1 :(得分:1)

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

线程也是如此:因为你不能将一个函数传递给线程(因为Java没有“函数”的概念),你必须从实现你自己的函数的线程类派生来执行,或者传递一个实现Runnable接口的类,它提供了要执行的函数(正如在Observer情况下一样)。

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

如果您拥有的是OO dessign,请考虑通过合成(将执行的线程存储为类的成员)来适应线程,而不是继承它。

注意:Java 8

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