2011-12-25 255 views
3

我想实现类似于Java中的Runnable接口。我试图这样做:C++ Runnable类

class Runnable{ 
    public: 
     void start(){ 
      t = std::thread(&Runnable::run, this); 
     } 
    protected: 
     virtual void run(){ 
     } 
}; 

想法很简单。我想重载运行方法,然后启动()应该启动超载。但是...它不起作用。

terminate called after throwing an instance of 'std::system_error' 
    what(): Operation not permitted 

PS我使用dlopen从动态库中加载一个派生自Runnable的类的实例。

+24

不要试图在C++中模拟Java。尤其是Java不如C++的部分。 C++不需要“Runnable”类,因为它有函子。让你的类重载'operator()()'而不是定义'run'函数,然后简单地将它传递给一个新的'std :: thread'。更简单,更清洁,更高效 – jalf 2011-12-25 19:56:02

+0

不幸的是,我仍然不熟悉C++ 11。我会调查一下。非常感谢! – Dejwi 2011-12-25 20:08:43

+3

它不是特定于C++ 11。你一直在C++中使用函子。对于C++ 11来说,新的唯一部分是你已经使用的'std :: thread'类。无论如何,我会回溯一下:'std :: thread'是一个对象,它不是包含“运行”函数,而是给出在其线程中运行的函数。这个函数可以用函数指针表示,但它也可以是* functor *,它只是一个重载'operator()'的对象。具有该运算符的对象'x'可以像函数一样被“调用”,语法为'x()'。 – jalf 2011-12-25 20:28:23

回答

4

当忘记在命令行使用-pthread时,GCC通常会看到此错误。

+2

我不使用pthreads – Dejwi 2011-12-25 20:01:56

+1

@MiniKarol:IIRC'std :: thread'在Linux上使用下面的pthreads。不过,我不知道这是否是错误的原因。 – 2011-12-25 20:06:30

+1

@MiniKarol如果你使用GCC 4.5+,你需要'-lpthread'来使用'std :: thread'。如果你使用其他的东西,这个问题需要更多的细节来回答。 – Cubbi 2011-12-25 20:06:34

0

我发现你的代码存在一个问题:你不能从类的构造函数中调用虚函数。这样做会产生未定义的行为。

+0

我知道在构造函数中我的对象没有完全初始化,但我没有在其中调用任何虚拟方法。 – Dejwi 2011-12-26 10:56:19

+1

您将函数指针传递给线程。这意味着线程可以在构造函数完成之前调用虚函数。似乎添加了很难追踪的错误。 – 2011-12-26 16:33:44