2011-12-25 253 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