我試圖從C++ 11使用std ::線程。如果在執行其某個函數成員的類中可能有std :: thread,我找不到任何地方。考慮下面的例子... 在我的嘗試(下面)中,函數是run()。C + + 11:std ::線程內執行一個函數成員與線程初始化在構造函數
我用-std = C++ 0x標誌編譯gcc-4.4。
#ifndef RUNNABLE_H
#define RUNNABLE_H
#include <thread>
class Runnable
{
public:
Runnable() : m_stop(false) {m_thread = std::thread(Runnable::run,this); }
virtual ~Runnable() { stop(); }
void stop() { m_stop = false; m_thread.join(); }
protected:
virtual void run() = 0;
bool m_stop;
private:
std::thread m_thread;
};
class myThread : public Runnable{
protected:
void run() { while(!m_stop){ /* do something... */ }; }
};
#endif // RUNNABLE_H
我得到這個錯誤及其他:(同樣的錯誤使用和不使用$這個)
Runnable.h|9|error: no matching function for call to ‘std::thread::thread(<unresolved overloaded function type>, Runnable* const)’|
當指針傳遞。
Runnable.h|9|error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say ‘&Runnable::run’|
這就是爲什麼需要'start()'是一個函數來完成實際的開始工作。 – 2011-05-10 21:41:25
我不認爲線程花費足夠長的時間來調度會改變行爲,不是它的構造函數做一個副本(因此切片)綁定的結果(&Runnable :: run,this)? – Cubbi 2011-05-10 21:48:17
@Etienne de Martel:有不同的方法,'start()'方法選項顯然是其中之一。另一種方法是boost和C++ 0x所採用的方法:將* runnable *對象從* thread *對象中分離出來,這會將操作作爲參數運行到構造函數中。這可以確保將要執行的對象完全構建。當然,如果你不強制你的方式進入破壞它的框架...... – 2011-05-10 21:50:11