我试图从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