2017-08-30 98 views
2

有人能告訴我怎樣才能運行一個新的線程與成員函數從不同類的對象作爲這個類的成員函數?什麼即時嘗試做我仍然得到錯誤。從另一個類的成員函數的類中的線程

no match for call to '(std::thread) (void (Boo::*)(), Boo&)'|
no match for call to '(std::thread) (void (Foo::*)(), Foo*)'|

#include <iostream> 
#include <thread> 
using namespace std; 
class Boo 
{ 
public: 
    void run() 
    { 
     while(1){} 
    } 
}; 

class Foo 
{ 
public: 
    void run() 
    { 
     t1(&Boo::run,boo); 
     t2(&Foo::user,this); 
    } 
    void user(); 
    ~Foo(){ 
     t1.join(); 
     t2.join(); 
    } 
private: 
    std::thread t1; 
    std::thread t2; 
    Boo boo; 
}; 
int main() 
{ 
    Foo foo; 
    foo.run(); 
} 
+0

'while(1){}'是UB,參見例如[is-this-infinite-recursion-ub](https://stackoverflow.com/questions/5905155/is-this-infinite-recursion- UB)。 – Jarod42

回答

4

您需要使用operator=建設

以下工作示例(see it in action)後分配線程:

#include <thread> 
#include <iostream> 

class Boo 
{ 
public: 
    void run() 
    { 
     int i = 10; 
     while(i--) 
     { 
      std::cout << "boo\n";; 
     } 
    } 
}; 

class Foo 
{ 
public: 
    void run() 
    { 
     t1 = std::thread(&Boo::run,boo); // threads already default constructed 
     t2 = std::thread(&Foo::user,this); // so need to *assign* them 
    } 

    void user() 
    { 
     int i = 10; 
     while(i--) 
     { 
      std::cout << "foo\n";; 
     } 
    } 

    ~Foo() 
    { 
     t1.join(); 
     t2.join(); 
    } 

private: 
    std::thread t1; 
    std::thread t2; 
    Boo boo; 
}; 

int main() 
{ 
    Foo foo; 
    foo.run(); 
} 
+0

他的錯誤是因爲線程調用的run()和user()方法不接受參數,您的代碼是否仍然存在這些錯誤? – Tyler

+1

不,你錯了 - 他試圖做的調用是使用'boo'對象執行'Boo'的'run' **成員函數**。也就是說,你同時需要成員函數指針和對象實例 –

+0

好的,謝謝,我誤解了線程構造函數的第二個參數。刪除了我不正確的答案 – Tyler

相關問題